默认构造函数和合成默认构造函数

  当我们没有为类中的对象提供初始值,此时就会执行默认初始化,类会通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数,这个函数并不需要任何的实参,但是如果我们的类没有显式地定义构造函数,那么编译器就会为我们隐式地定义一个默认构造函数(只要没有显式定义构造函数,编译器就会提供默认构造函数,如果为类中的对象提供了初始值的话,就不会控制默认初始化过程了)。

  实际上,默认构造函数并不一定都是编译器隐式地提供的,而有可能是用户自己写出来的,前提是用户本来已经写过了其他的构造函数,但是仍然需要这样的一个默认构造函数的时候,就需要用户自己进行书写,此时没有参数的构造函数就是构造函数,但是如果想要此时的构造函数和原来因为没有定义构造函数而被编译器隐式定义的合成的默认构造函数一样的话,只需要在声明后面写一个=default就可以了。如下:

class Sales{
  Sales()=default;
//这里省略了其他的构造函数和类中成员,但是只要知道实际中是存在的就可以了
}

  对于系统隐式的默认构造函数,我们称之为合成得默认构造函数。

  但是实际上,有一部分时候我们已经有了自己定义的构造函数,但是仍然需要显示地默认构造函数(但是肯定不是合成构造函数了,默认构造函数除了隐式的编译器自己的合成默认构造函数之外就必须得像上例一样显示给出)

  很多情况中,即使我们已经显示地给出了构造函数,仍然需要显示地给出默认构造函数,具体大的情况分为两种:默认初始化和值初始化

  默认初始化分为:

   1、当我们在类作用域内部使用任何初始值定义一个非静态变量或者数据时;

   2、当一个类本身含有类类型的成员且被含有的这个类类型的成员使用合成的默认构造函数时;

   3、当类类型的成员没有在构造函数初始值列表中显式地初始化时;

  值初始化分为:

   1、在数组初始化的过程中如果我们提供的初始值数量少于数组的大小的时候;

   2、当我们不使用初始值定义一个局部静态变量的时候;

   3、当我们通过书写形如T()的表达式显式地请求值初始化时,其中T是类型名,比如vector()中可以只用一个实参用于说明vector中的元素个数,而当括号里是类的    话;

   所以因为有以上情况的存在,在已经存在构造函数的情况下,(也就是说此时没有合成默认构造函数的时候是没有默认构造函数的)就需要我们主动显式指出默认构造函数,所以在C++primer中是估计我们即使在已经有构造函数的情况下。

   


  

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值