explicit关键字

构造函数定义的类型转换
前言

explicit关键字在C++中的作用是限制构造函数定义的类型转换,使其只能通过显示转换的方式完成。为了说明它的用法,先来看看下面的内容:

我们知道当一个函数返回类型是一个类时,函数调用返回后,一个无名的临时对象会被创建,这种创建不是由用户显示指定的,而是隐含发生的。事实上,临时对象也可以显示创建,方法是通过使用类名调用这个类的构造函数。如下:

//LinePoint是两个类
//PointLine的成员变量
cout << Line(Point(1), Point(4)).getLen() << endl;

这里用参数1和4创建了一个Point的临时对象,然后以这两个临时对象去创建一个Line临时对象,最后调用Line类的getLine()函数。

上面用Point(1)和Point(4)创建两个临时对象,这种方式其实和C++中基本类型的类型转换是很相似的。只不过它是把一个整型数据转换为Point型对象的显示类型转换。
C++中可以通过构造函数,来自定义类型之间的转换。一个构造函数只要可以用一个参数调用,那么它就设定了一种从参数类型到这个类类型的类型转换。就像之前说的那样,从整型到Point类型。由于是类型转换,所以上面的代码,还可以写成下面的形式:

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

这里的类型转换操作可以省去,因为默认情况下,类的构造函数所规定的类型转换,允许通过隐含类型转换进行。也就是说可以写成这种下面这种形式:

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

但是上面的这种写发,是有可能出问题的,如果调用Line构造函数时传递了类型错误的参数,而自动发生的隐含转换编译时不会报错,但在运行时会出问题。因此,为了避免这种隐含转换的发生。只要在构造函数前加上explicit关键字,那么以这个构造函数定义的类型转换,只能通过显示转换的方式完成。如下:

explicit Point(int xx = 0, int yy = 0) {
    x = xx;
    y = yy;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值