您的位置:首页 > 编程语言 > C语言/C++

C++:new运算符和new表达式详解

2012-05-27 14:59 393 查看
摘要:在C++中new是一个行为和语法都有点诡异的结构,它的语法上与其它C++语法不同,它在语义上却也经常引起人们的不解,尤其当用户自定义的new在使用的时候。本文试图回答作者在学习new的时候遇到的问题,同时这些问题也可能是大多数人首先遇到的问题。

目录 [隐藏]

new 关键字

new 运算符

new 表达式

new 关键字

new是C++的关键字,它不仅仅是一个运算符,它是核心语言的构成部分,这一点就保证了,相对与其它运算符而言,new总是或者new看上去已经是特殊的了。

学习过C语言的人都知道,C语言没有在核心语言上设置一个内存分配器,它只是通过标准库的malloc函数簇来完成这些事。但是C++在核心语言上提供了new与delete关键字。作为库的malloc可能被其它函数无声地,或者安全的或不安全地替换掉,但是作为核心语言一部分的new与delete是不会发生这些事的,在我们C++代码中,无论何时见到的new和delete都C++语言的指定的那个new或delete,不可能是其它什么东西。这样的东西,编译器可以严格控制它的行为。

在我们的代码中,new存在两种身份,一种是作为一个内存分配函数来使用的new运算符,实际上它是不过直接调用的,但是用户可以覆盖它;另一个身份就是在我们使用的时候,它作为一个new表达式来使用,此时new就是核心语言的的一部分,用户不能动它,由编译器来处理。

在我们的代码中写下“new”这个单词的时候,只有在一种情况下,我们不是在写new表达式,那就是在定义用户的new运算符的时候;而在其它的任务时候,我们写下“new”的这个单词的时候,都是在调用核心语言的那个new,这绘根据情况自动选择用户定义的new运算符或都使用默认的new运算符。

new 运算符

new是一个运算符,同时也跟多数一般的运算符一样,可以针对用户的类型进行重载,或者说复写更合适。因为系统就像 operator= 一样会生成一个默认的版本,除非用户都覆盖它,否则它会自动生成。让我们看看一个示例:

struct Test

{

Test operator+(const Test& other)

{

int v= _value
+ other._value;

Test t;

t._value=v;

return t;

}

private:

int _value;

};

你可以已经注意到了,我只是重定义了一个运算符 operator+ ,正如我们可以定义 operator+ 一样,我们也可以定义 operator new。

struct Test

{

void operator
new(size_t n)

{

//分配一块有n字节的内存并返回

return p;

}

private:

int _value;

};

直到现在我们一直都在说作为运算符的new,用户只有要定义一个new运算符的时候,才可以接触到new的这个身份,而在其它任何时候,用户接触到的new总是作为表达式的new,它是不可能被重定义的。作为表达式的new会根据实际的情况,去决定调用或不调用用户定义的new运算符。

new 表达式

在我们使用一个new的时候,它总是一个表达式,此时它就是一个new表达式。比如我们在代码中写下:

Test* test=
new Test;

上面情况就是一个new表达式,它终止都作为内置定义的new。在示例的情况下,这个内置类型的new会自动调用的我们在上面定义的那个new运算符。这就是说,我们不能直接调用一个new运算符,而不通过new表达式,或者说内置的new。

内置的new有这样的语法:

new
[参数列表] TYPE
[初始化列表]

其中两个列表都是可选的,当省略前一个列表的时候,说明分配空间的new运算符只需要一个大小的参数;当省略了后面的列表时,说明TYPE存在一个没有参数的构造函数。如果一个类型没有可用的构造函数,那么不能简单的使用new来分配内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: