C++-C++ 在什么情况下会生成默认构造函数?
在一个类中,如果我们没有定义构造函数,编译器一定会生成一个默认构造函数吗?如果不一定,那在哪些情况下会生成默认构造函数?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在一个类中,如果我们没有定义构造函数,编译器一定会生成一个默认构造函数吗?如果不一定,那在哪些情况下会生成默认构造函数?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
C++编译器会在编译器需要的时候而不是程序需要的时候合成出一个non-trivial默认构造函数。
这种情况有四种:
(1)如果一个类没有任何构造函数,但是有一个成员对象,它有默认构造函数。但是编译器产生默认构造函数只有在构造真正需要的时候才发生。
(2)有一个含有默认构造函数的基类。那么编译器将会生成一个默认构造函数,调用上层基类的构造函数。
(3)含有虚函数。
(4)有一个虚基类。
需要注意的是,编译器在这四种情况下合成的构造函数只满足编译器的需要!!!而不是程序的需要。
至于没有这四种情况而且没有默认构造函数时,它所拥有的只是默认的trivial(无用的)构造函数,实际上并不被合成出来。
具体可以参考《深度探索C++对象模型》一书chapter2.1 Default Constructor的建构操作
如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:
1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;
2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);
3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或 编译器提供的默认构造函数)。
<类名>::<类名>(){},即不执行任何操作。
举个例子
struct TA
{
TA(){} //这行就是默认的构造函数
};
默认构造函数、拷贝构造函数、复制运算符、析构函数四种函数都会在下列四种情况下由编译器产生:
1. 类中有一个data member,这个data member所属的类有默认或是显式的上述四种函数。
2. 类的父类有默认或是显式的上述四种函数。
3. 有虚函数的类。
4. 有虚基类的类。