先来看一下下面这段代码,思考一下会发生什么?
class A {
};
A a;
有经验的小黄鸭应该会知道,这里面调用了A类的默认构造函数。
下面讲解一下:
这段代码定义了一个空的类A,并进行实例化出了类型A的对象a。
小黄鸭小A:那么什么是实例化呢?
实例化的过程是分配一块内存空间,然后对其内存空间的数据进行初始化。
这是两个步骤:
1、分配内存
2、初始化内存数据
然后在初始化的时候就是执行了A类的构造函数,也就是说上面的代码会分配一块内存给a,并执行了A类的构造函数。
小黄鸭小A:你骗人,这里并没有看到你说的构造函数呀
其实编译器会自动给我们生成一个默认的构造函数,但是~。
运行一下下面这段代码
class A {
public:
A(int i) : a(i) {
}
private:
int a;
};
A a;
小黄鸭小B:呱呱,这代码根本编译不通过呀
error: no matching constructor for initialization of 'A'
小黄鸭小A:这看上去是因为没有构造函数
对的,是因为上面这段代码给类A定义了一个构造函数A(int i),所以编译器认为不需要再为你自动生成一个默认的构造函数了。
然后我们定义的A(int i)是一个有参数的构造函数,实例化a时需要的是一个无参数的构造函数,此时编译阶段发现没有无参数的构造函数,于是编译器报错了。
众鸭子:呱呱呱