一.构造函数的隐式类型转换
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))
匿名对象不仅可以用在传参上,还可以用在函数调用上:
比如就单纯想打印个日期,可以如下操作: