C++中new操作符和operator new 是两个不同的概念!
string *p=new string("hello c++!");(注意C++的string是封装好的类型)!
这里所使用的new操作符!别看它是英文单词!但是它和'+','-'等一样,都是C++的运算符,
一个更好的例子就是sizeof运算符!
对于new运算符总是完成两项工作:一是分配足够的内存来容纳对象,二是调用构造函数来初始化分配的内存!
上面提到的operator new 就是来完成第一步的,所以说new运算符包含operator new 的功能!
它的函数原型是:void* operator new(size_t size);返回的是一个指向刚才所分配内存的指针,就好像C语言中malloc函数,其实它的内部实现就是调用malloc函数!size 是制定要分配的内存的大小,你可以重载这个函数但是必须保证第一个参数一定是size_t类型!
我们一般情况下是不需要显示调用operator new的但是如果非要调用的话,也是可以的:
void* memory=operator new(sizeof(string));
这样operator new 返回了一个void指针指向一块足够容纳一个string对象的内存!
就和malloc一样,operator new 的唯一作用就是非配内存!
下面说说new 运算符的第二步:调用构造函数!
还是以开头的那个例子说事:
它可以分成如下几步(伪码):
void* memory=operator new(sizeof(string));
call string::string("hello c++")on memory;
string* pa=static_cast<string>(memory);
我们可以手动的去完成new运算符的第一步功能,但是第二步就不可以了,我们是不能显示的调用构造函数的!但是编译器给了我们一个折中的办法!来完成这个有时候看似必要的操作!是什么时候呢?就是有时候当我们动态的分配了一段内存后并没有初始化(调用构造函数)比如:void* memory =operator new(sizeof(string));
这段内存没有初始化,这时候我们可以调用operator new 的一个特殊版本placement new来完成接下来的工作:string *p=new(memory)string("hello c++!");
这两句话加起来就相当于new运算符做的事情了!
其实这些知识在我们平时的学习中很少用到,但是如果你了解了,它会帮助你更加深刻的理解一些知识!