编译器生成默认构造函数的情况

  

在类没有显示声明构造函数的情况下,编译器并不总是为我们自动生成默认构造函数,以下4种情况,编译器才会为我们自动生成默认构造函数:

  1.类中有一个类成员含有默认构造函数的,编译器会为该类自动生成默认构造函数,自动插入代码,调用该成员的构造函数;

  2.基类中含有默认构造函数,编译器会为该类自动生成默认构造函数,自动插入代码,调用基类的构造函数;

  3.类中含有虚函数时,由于编译器要为该类生成虚函数表vtable,并为该类的对象生成指向该vtable的vptr,所以需要为该类合成默认构造函数;

  4.虚继承时;

  除了这四种情况,编译器不会为我们自动生成默认构造函数,例如类中的整数、指针、数组等,因为这些成员的初始化对编译器来说都不是必要的,所有都不会自动被初始化,这些成员的初始化需要程序员自己显示编写代码实现;

时间: 2024-10-26 06:50:18

编译器生成默认构造函数的情况的相关文章

C++系统自动生成默认构造函数的情况

(1) 基类存在默认构造函数 class CBaseClass { public: CBaseClass() { m_i = 0; } private: int m_i; }; class CDriveClass: public CBaseClass { public: void func() { } private: }; (2) 成员变量存在默认构造函数 class CTestClass { public: CTestClass() { m_i = 1; } private: int m_i

编译器自动生成默认构造函数的四种情况

在以下四种情况中,如果类中没有定义一个默认构造函数,则编译器会自动生成一个nontrivial的默认构造函数,而不是一个不做事情的trivial默认构造函数:1.内含一个成员变量,而这个成员变量所属的类中含有默认构造函数,则此时需要为此类生成一个implicit default constructor(隐式的默认构造函数),这个implicit default constructor是nontrivial的,因为内含的成员变量需要进行默认构造操作. 如果内含一个成员变量a,且该成员变量a含有默认

C++编译器合成默认构造函数的条件(合成默认拷贝构造函数雷同)

当用户没有为类定义构造函数的时候,编译器并不是为每个类合都成默认的构造函数,只是在编译器需要的时候才合成默认构造函数.编译器合成默认的构造函数只是满足编译器的编译的需要,而不是满足程序员的需要(例如,成员变量的初始化工作还需要程序员来定义构造函数). 1.对象中包含带有默认构造函数的对象 class A{ public: A(); } class B{ public: A a; } 在组合中B需要编译器合成默认的构造函数,来调用A的默认构造函数,来定义(并不帮助程序员初始化)B自己的成员变量,内

C++编译器合成默认构造函数和复制控制成员(拷贝构造函数,赋值操作符,析构函数)的条件

(参考自<深入理解C++对象模型>) ”C++新手一般有两个常见的误解: 任何class如果没有定义default constructor,就会被合成一个出来. 编译器合成出来的default constructor会明确设定class 内每一个data member的默认值.” 现在主要解释第一条为什么是错误的,根据<深入理解C++对象模型>,”default constructor 在需要的时候被编译器产生出来”,以下就是4种”需要的时候”: 1). 该类含有一个成员对象而后者

[C++11] 默认构造函数

类通过一个特殊的构造函数来控制默认初始化过程,这个函数就是默认构造函数,默认构造函数无需任何实参.我们可以显示的定义默认构造函数也可以让编译器为我们生成默认构造函数.默认构造函数以如下规则初始化累的数据成员: 如果存在类内初始值,用它来初始化成员. 否则,默认初始化该成员. class Sales_data { public: std::string bookNo; unsigned units_sold = 0; double revenue = 0.0; }; 如上所示,因为Sales_da

C++默认构造函数的一点说明

大多数C++书籍都说在我们没有自己定义构造函数的时候,编译器会自动生成 默认构造函数.其实这句话我一直也是深信不疑.但是最近看了一些资料让我 有了一点新的认识. 其实我觉得大多数C++书籍之所以这样描述其实是玩了文字游戏的.如果说编译器 自动产生的默认构造函数对于我们的类没有任何作用,也就是说在编译器默认生成 的这个构造函数里根本没有任何实质性的代码工作,那么这种默认构造其实是可有 可无的,所以不妨说编译器其实是为每个类生成了默认构造函数的. 在深度探索C++对象模型中讲了四种关于编译器自动生成

【C/C++】构造函数、默认构造函数、成员初始化列表

常见问题 Q1. 下列关于构造函数的描述中,错误的是( ) A. 构造函数可以设置默认的参数 B. 构造函数在定义类对象时自动执行 C. 构造函数可以是内联函数 D. 构造函数不可以重载 Q2. 下列代码中a.b的各个成员变量值是多少? 1 class Student 2 { 3 public: 4 Student() {} 5 void show(); 6 private: 7 string name; 8 int number; 9 int score; 10 }; 11 Student a

C++ 合成默认构造函数的真相

对于C++默认构造函数,我曾经有两点误解: 类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个合成的默认构造函数. 合成默认构造函数会初始化类中所有的数据成员. 第一个误解来自于我学习C++的第一本书 <C++ Primer>,在书中392页:“只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数”. 实际上这句话也没有说错,它说明了默认构造函数定义的必要非充分条件,然而却给当时初学C++的我造成了一定的误解. 第二个误解依旧来自于Primer中的一句话:“合成的

C++对象模型之默认构造函数的构造操作

一个类,如果没有任何的用户声明的的构造函数,那么会有一个默认的构造函数被隐式地声明出来.这个被隐式声明的构造函数,究竟什么时候被合成.被编译器合成的默认构造函数究竟执行怎么样的操作,编译器如何处理用户定义的构造函数,就是本文要探讨的问题. 1.默认构造函数何时被合成 如果一个类没有任何的用户声明的构造函数,那么在当编译器需要的时候,编译器会为类合成一个默认的构造函数,它只用于执行编译器所需要的操作.注意,默认的构造函数是在编译器需要的时候被合成出来,而不是程序需要的时候,如果程序需要,则默认的构