C++中类的默认构造函数调用的时机

1 不指定类对象的初始值时

当不使用任何初始值定义一个类的非静态变量时,会调用该类的默认构造函数。

A a;

此时,会调用类A的默认构造函数。在《C++中类的合成默认构造函数2-1》https://blog.csdn.net/hou09tian/article/details/108072603中提到,如果类中没有显式地定义默认构造函数,则C++编译器会为其创造一个合成的默认构造函数,如果类中已经定义了其他格式的构造函数,此时C++编译器不会再为其合成默认构造函数。所以,如果此时类A的定义为

class A {
public:
  A(int i){}
};

此时,程序会报错,报错信息为“error C2512: “A”: 没有合适的默认构造函数可用”。

2 类本身含有类的对象且使用该类的默认构造函数时

当类B含有类A的对象,并且使用类B的默认构造函数时,会调用类A的默认构造函数。

class A {
  public:
    A(int i){}
};

class B {
  A m_a;
};

使用类B的默认构造函数来创建该类的对象

B b;

此时,会调用类B的合成默认构造函数,并调用类A的默认构造函数。因为类A没有默认构造函数,所以此时程序报错信息为“ error C2280: “B::B(void)”: 尝试引用已删除的函数”。

3 类本身含有类的对象且没有在构造函数中显式初始化该对象时

 

class A {
  public:
    A(int i){}
};

class B {
  public:
    B(int i){
}
    A m_a;
};

此时,类B的构造函数没有显式地初始化类A的对象m_a,那么则需要调用类A的默认构造函数来初始化m_a,但是类A没有定义默认构造函数,因此,程序的报错信息为“ error C2512: “A”: 没有合适的默认构造函数可用”。

你可能感兴趣的