- #include
- using namespace std;
- class A
- {
- public:
- int x;
- A(){
- cout << "A构造函数被调用了" << endl;
- }
- ~A(){
- cout << "A析构函数被调用了" << endl;
- }
- };
- int main()
- {
- A* a = new A();
- cout << a->x << endl;
- return 0;
- }
- A构造函数被调用了
- -842150451
实例一
现象:实现构造函数,使用new(),构造函数被调用,未初始化变量
分析:使用new()调用了构造函数,但构造函数中没有初始化变量,所以变量为任意值
实例二
现象:未实现构造函数,使用new(),变量被初始化
分许:编译器自动生成构造函数,并实现变量的初始化
实例三
现象:未实现构造函数,使用new,未初始化变量
分析:编译器没有自动生成构造函数???
猜测:使用new()时,编译器会给没有构造函数的对象提供一个构造函数。而使用new,构造器不会给POD类型的类提供构造函数。简而言之,当类的类型为POD时,new,new()的区别在于编译器是否提供构造器。
注:POD是一个struct或者类,且不包含构造函数、析构函数以及虚函数。
new主要有以下两个功能:
1、分配空间:调用函数operator new来实现
2、调用构造函数:调用placement new来实现
operator new函数调用了malloc()函数来分配空间
placement new用于将空间充分给类中各个元素
于是有了以下两种高级操作
操作一:
- class A {...} //声明一个 类
- A void *buf = malloc(sizeof(A)); //简单地分配空间。
- A *ojb = new (buf)A(); // 在分配的空间上调用构造函数。
- --------------------------------------------------------
- class A {int a;}
- int buf[sizeof(A)]; //在栈上,分配一个数组
- A *obj = new(buf) A(); //在这个数组上构造一个 对象 A。
操作二:
重载 operator new 和 placement new