C++默认构造函数

Default Constructor

构造函数的定义

什么是默认构造函数,默认构造函数又在何时被创建出来呢?根据c++ primer plus上的说法

  1. 默认构造函数是在未提供显示初始值时,用来创建对象的构造函数。
  2. 当且仅当类中没有定义任何构造函数时,编译器才会提供默认构造函数。
假设`Stock`类的的声明如下:
```c++
class Stock{
public:
	string company;
	int shares;
	float share_val;
	float total_val;
}

可以看到用户没有为Stock类提供构造函数,那么编译器会为Stock提供默认构造函数(其实这句话有问题),形式如下

Stock::Stock(){
};

可以看到这个函数其实什么都没有做,不带有参数也不进行初始化动作,被称作是implicit trivial Default constructor,看起来好像毫无作用,实际上就是毫无作用。

如果用户定义了非默认构造函数,如果使用了如下的声明

	Stock fluffy_the_cat;

那么编译器就会报错,因为当用户定义了非默认构造函数后,编译器就不会再自动生成默认构造函数
因此如果使用如上的声明,就需要用户自定义默认构造函数。

构造函数类型

构造函数的形式有两种

  1. 不带有任何参数的构造函数
  2. 所有参数带有默认值的构造函数

第一种:

	Stock::Stock(){
		//do something
	}

第二种:

	Stock::Stock(String &company = "Error", int  value = 0,.....){
		//do something
	}

到这里好像都没有什么问题,但是实际上,关于如果class没有定义默认构造函数,编译器就会合成出来这句话却存在问题,对于Stock类来说,编译器生成的这种默认构造函数是implicit trivial default constructors,因为它们的确什么都没有做,那么编译器自动生成默认构造函数有啥用呢?实际上在多种情况下,编译器做的事情远不止这么多。

Nontrivial Default constructor

可以理解为有用的默认构造函数,根据<深度探索C++模型>的说法,存在如下四种情况。

  1. 带有默认构造函数的成员类变量。
  2. 带有默认构造函数的基类。
  3. 声明或者继承了虚函数。
  4. 继承自虚基类。

其实这里的nontrivial,就是指在这四种情况下,默认构造函数需要做一些事情来满足程序的要求。

带有默认构造函数的成员类变量

编译器会在当前类的每一个构造函数中都加上这些成员类变量的默认构造函数,包括编译器自己生成的构造函数。

带有默认构造函数的基类

编译器会在当前类的每一个构造函数中都加上基类的默认构造函数,包括编译器自己生成的构造函数。

以上两种对于使用初始化列表显示调用的,其实也是经过编译器在构造函数内部添加对应构造函。

声明或者继承了虚函数

因为当带有虚函数时,不可避免会涉及到vtbl(虚函数表)和vptr(指向虚函数表的指针),编译器会在当前类的每个构造函数中加上对虚函数表和虚函数指针的相关操作。

继承自虚基类

因为编译器要在编译时确定一些成员变量的具体位置,会在类中通过某个指针指向虚基类,编译器会在当前类的每个构造函数中加上对该指针的相关操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值