C++-C++ 在什么情况下会生成默认构造函数?

发布于 2017-01-26 07:19:15 字数 67 浏览 1468 评论 3

在一个类中,如果我们没有定义构造函数,编译器一定会生成一个默认构造函数吗?如果不一定,那在哪些情况下会生成默认构造函数?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

归属感 2017-10-15 09:09:58

C++编译器会在编译器需要的时候而不是程序需要的时候合成出一个non-trivial默认构造函数。
这种情况有四种:
(1)如果一个类没有任何构造函数,但是有一个成员对象,它有默认构造函数。但是编译器产生默认构造函数只有在构造真正需要的时候才发生。
(2)有一个含有默认构造函数的基类。那么编译器将会生成一个默认构造函数,调用上层基类的构造函数。
(3)含有虚函数。
(4)有一个虚基类。

需要注意的是,编译器在这四种情况下合成的构造函数只满足编译器的需要!!!而不是程序的需要。

至于没有这四种情况而且没有默认构造函数时,它所拥有的只是默认的trivial(无用的)构造函数,实际上并不被合成出来。

具体可以参考《深度探索C++对象模型》一书chapter2.1 Default Constructor的建构操作

甜柠檬 2017-08-21 05:03:11

  如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:
1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;
2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);
3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或 编译器提供的默认构造函数)。
  <类名>::<类名>(){},即不执行任何操作。

举个例子

struct TA
{
TA(){} //这行就是默认的构造函数
};

归属感 2017-07-10 23:43:34

默认构造函数、拷贝构造函数、复制运算符、析构函数四种函数都会在下列四种情况下由编译器产生:
1. 类中有一个data member,这个data member所属的类有默认或是显式的上述四种函数。
2. 类的父类有默认或是显式的上述四种函数。
3. 有虚函数的类。
4. 有虚基类的类。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文