用构造函数定义类型转换

用构造函数定义类型转换

用构造函数定义的类型转换

此内存主要来源于清华大学郑莉老师的《C++语言程序设计》,在此作记录是便于查看,感兴趣的读者可去看看此书。
用户可以为类类型定义数据转换。而在很多时候一个对象的类型转换,需要通过创建一个无名的临时对象来完成。因此,需要了解临时对象。
当一个函数返回类型为类类型时,函数调用返回后,一个无名的临时对象会被创建,这种创建不是由用户显式指定的,事实上,临时对象也可以显式创建,方式是直接使用类名调用这个类的构造函数。例如:

cout<<Line(Point(1),Point(4)).getLen()<<endl

注:临时对象生存期很短,在它所在的表达式被执行完后,就会被销毁

Point(1)和Point(4)创建两个临时对象,形式为“类型说明符(表达式)”的显示类型转换符号。其实这正是类型转换—将整型数据转换成Point型对象的显式类型转换。
C++中可以通过构造函数,来定义类型之间转换。一个构造函数,只要可以用一个参数调用,那么它就设定了一种从参数类型到这个类类型的类型转换。由于是类型转换,所以上面一行代码,还可以写成下面两种等效形式;

cout<<Line((Point)1,(Point)4)).getLen()<<endl;
cout<<Line(static_cast<Point>(1),static_cast<Point>(4)).getLen()<<endl;

这里的类型转换操作符甚至可以省去,因为在默认情况下,类的构造函数所规定的类型转换,允许通过隐含类型转换进行。可写成如下形式:

cout<<Line(1,4).getLen()<<endl;

无论把类型转换写成哪种形式,在程序执行时,都会通过调用Point类的构造函数来建立Point类的临时对象。类型转换的结果就是这个临时对象。

只允许显式执行的类型转换

然而,有时并不希望这种类型转换隐含地发生,例如,上面的写法Line(1,4)中,把1,4作为Line构造函数的两个参数的含义很不明确。如果调用Line构造函数时传递了类型错误的参数,但自动发生的隐含转换却会使编译系统无法将错误报告出来。因此,C++允许避免这种隐含转换的发生。只要在构造函数前加上explicit关键字,以这个构造函数定义的类型转换,只能通过显示转换的方式完成。就像这样;

explicit Point(int xx = 0,int yy = 0){
 x = xx;
 y = yy;
}

如果函数的实现与函数在类定义中的声明是分离的,那么explicit关键字应当写在类定义中的函数原型声明处,而不能写在类定义外的函数实现处–因为explicit是用来约束这个构造函数被调用的方式的,属于一个类的对外接口的一部分,而是否加explicit关键字,与函数实现代码的生成无关
如果为Point的构造函数添加了explict关键字,那么下面的语句就是非法的了:

cout<<Line(1,4).getLen()<<endl;

但是上面的另外几种显示类型转换的写法都是合法的。
如果一个构造函数可以只用一个参数调用,并且由此定义的类型转换没有明确的意义,那么应当对这个构造函数使用explicit关键字,避免类型转换被误用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值