C++ new 内存开辟 & 构造函数

以前一直以为是由C++构造函数完成内存开辟的。

C++ 一个空内,它会默认生成一些函数,以前是4个,现在可能更多了…

class Student {

};

//堆上
Student* s = new Student;
//栈上
Student s;

C++ 一般有两种生成对象的方法:一种是在堆上new一个对象,另一种是在栈上定义一个对象。堆上的空间由程序员自己管理,栈上的空间由系统负责维护。

我以前看了《深入探索C++对象模型》一本书,它说只有在编译器需要的时候才会产生有用的构造函数、其他情况下产生的构造函数是有用的。我一度有以下几种误解或疑惑:
[x] 在编译器不需要构造函数的情况下,就不会生成构造函数。
[x] 内存是由构造函数开辟的。
[?] 既然,没有构造函数,为什么可以定义类对象呢?

后来,我猜明白了,new / delete是C++的关键字,它和malloc / free 是由区别的。主要表现在,以上的两种写法会被编译器更改为:

Student* s;
if (s = __new(sizeof(Student)))
s = Student::Student(s);

(堆上)这就解释了,产生一个类时,首先是根据类的size来开辟空间,之后才调用构造函数,而且也明白了类成员函数第一个参数为隐式的this指针。

Student s;
s.Student::Student();

(栈上)同样也分为了两步。第一步在栈上开辟了空间,第二步还是会显示调用构造函数。

References:

[1]《深度探索C++对象模型》 侯捷 译