- 默认构造函数是在创建对象时,未提供显示的初始值时调用的构造函数
- 程序员可以定义两种默认构造函数
X::X(){...}//一个无参的默认构造函数
X::X(int a = 5,char b = 'c'){...}//所有参数都有默认值的默认构造函数
- 若程序员没有定义任何的构造函数,则编译器会定义默认构造函数
- 编译器构造默认构造函数的情况
- trivial default constructor(无能默认构造函数)
- 无能默认构造函数形如其义,编译器会构造一个类似
X(){}
的函数,没有初始化列表,并且函数体为空,啥也不干,只是为了使程序通过编译。 - 默认的构造函数,对内置和复合类型的成员,如指针和数组,只对定义在全局作用域中的对象才初始化,所以如果一个类中包含了这类成员,不应该依赖于默认构造函数,它应该定义自己的构造函数来初始化这些成员。(类的静态变量,需要在类声明之外,初始化类的静态变量)
- 无能默认构造函数形如其义,编译器会构造一个类似
- nontrivial default constructor(有能默认构造函数)
有四种情况下(编译器需要)编译器会创建有能默认构造函数。
① 类有一个类成员,并且类成员有默认构造函数(可以是编译器生成或程序员添加)。
②类继承自一个base class ,并且base class 有默认构造函数。
③类内部有virtual 函数。
④类继承自一个或多个virtual base class 。
每种情况具体见博客
https://blog.csdn.net/hankai1024/article/details/7947989
四种情况较为详细。
- trivial default constructor(无能默认构造函数)
总结一下,编译器自定义的构造函数在任何时候都不会给(内置类型)数据成员赋初值的,他只会 ②(扩张)调用基类的构造函数,或者①(扩张)调用内部非内置类型的构造函数。编译器自定义的构造函数只会③在类本身或者祖宗类中有虚函数的时候建立虚表并且给虚指针赋初值,以及④有虚基类的时候初始化指向虚基类的指针
default和delete关键字
- default:显式缺省,告知编译器生成函数默认的缺省版本。
如:自定义构造函数后对默认构造函数的保留。 - delete:显式删除,告知编译器不生成函数默认的缺省版本
注:编译器给空类添加的函数不在此做介绍,此以缺省构造函数做简介说明default的用法。- 如果程序员实现了构造函数,系统则不会帮你实现默认构造函数
class X
{
public:
X(int A,int B):a(A),b(B){};
int a;
int b;
}
int main()
{
X x;//报错,没有默认构造函数
return 0;
}
- 此时需要自己定义一个默认构造函数
class X
{
public:
X(){}//可以是trivial
X(){a = 10;b = 20;}//也可以是nontrivial
X(int A,int B):a(A),b(B){};
int a;
int b;
}
int main()
{
X x;
return 0;
}
- 引入default关键字(可以保持类是POD类型:POD类型二进制拷贝后还能保持其数据不变)
class X
{
public:
X()=default;
X(int A,int B):a(A),b(B){};
int a;
int b;
}
int main()
{
X x;
return 0;
}
网友评论