C++中的new关键字完成的工作是两步:
- 调用operator new函数,分配内存空间。默认的operator new函数可能会抛出异常。这也是new关键字会抛出异常的原因。用户可以重载这个函数,于是new关键字就会调用这个自定义的operator new函数。
- 调用placement new函数。这个函数是在已经分配好的空间上调用构造函数。调用方法形如:
new (ptr) A(5);
。placement new也是重载的一个operator new的版本,它是不能被用户替换的。
让一个类只能被静态创建
就是只能把类创建在栈上而不能创建在堆上,方法就是将这个类的operator new
方法定义为私有的。于是在new一个对象的时候,去调用这个operator new
会发生编译错误:
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "int A is constructed!" << endl;
}
private:
void* operator new(size_t t) {
cout << "private new operation!" << endl;
return malloc(t);
}
};
int main() {
A* ptr = new A();
return 0;
}
上面这个cpp会编译错误。