c++构造函数的隐式类型转换以及explicit关键字

一.构造函数的隐式类型转换

1.接收单个参数的构造函数的隐式类型转换

这里的A a=4;就是构造函数的隐式类型转换(把整形4转换成了一个对象)

实际上是用4调用A的构造函数生成一个临时对象(注意是临时对象!!!),再用这个临时对象拷贝构造出a。

但是,编译器会进行优化,直接优化成:用4直接构造a。如下:

但注意,下面这样就错了!!:

这是因为首先要用4调用A的构造函数生成一个临时对象,临时对象具有常性,不能给到一个变量引用,而应使用常引用来接收,如下:

分类:

不仅仅是针对于单参数构造函数,也针对于构造函数有多个参数但只有第一个参数没有缺省值,还针对于全缺省构造函数。如下日期类:

这是第一个参数没有缺省值的情况

这是全缺省的情况

应用:

顺序表中,比如要存放一个对象,它只有一个参数或者存在单参构造函数,就可以使用这个知识点

上面这个pushback在被调用时,可以直接传数字:PushBack(4),实际上就是用数字去构造对象

2.接收多个参数的构造函数的隐式类型转换

c++11支持多参数的隐式类型转换,表示方法如下:

与单参数同理:

顺序表中传递B的实例对象时,也可以传数字:PushBack({4,5});

日期类也可以:

二.explicit关键字

在上面的介绍中 像Date d=2023,Date d={2023,4,5}这样的代码的可读性很差,不利于其他人都我们的代码。为了防止出现这样的代码,可以给构造函数加上explicit关键字,加上之后就不支持隐式类型转换了

匿名对象:

那又有人说了,加上explicit关键字后,隐式类型转换被禁了,那pushback传参不就又像之前一样那么麻烦了吗?

为了解决这个问题,我们可以使用匿名对象:

那么pushback的调用就可以变成:

PushBack(A(7))    PushBack(B(7,8))    PushBack(Date(2023,4,5))  

匿名对象不仅可以用在传参上,还可以用在函数调用上:

比如就单纯想打印个日期,可以如下操作:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值