欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

《C++ Primer》隐式类类型转换学习整理

时间:2021-06-29 08:25:54|栏目:C代码|点击:

C++ Primer中有这样一句话:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个转换。这句话用下面一段代码表示为:

class A
{
  A(B b);//单个实参的构造函数
  func(A a);
} 
.....
A a;
B b;
a.func(b);//func函数本应该接受A类型的实参,但是由于特殊构造函数的存在,所以B类型的参数b借助这个特殊的构造函数转化为A类型对象,完成转换。所以这条语句是正确的

从上述代码段可以看出来,单个实参调用的构造函数定义了类类型到其他类型的转换,并且这种转换是隐式发生的,这里有几个关键字:单个实参,构造函数,隐式转换。

隐式转换的过程发生了什么?对象a并没有参数类型为B的成员函数,但是它有一个单一B类形参的构造函数,所以编译时是不会报错的。对于a.func(b)这条语句,编译器会用这个特殊的构造函数,生成一个临时对象,然后以临时对象调用正规的 func(A a)函数,func(A a)函数结束,临时对象被注销。

这种转换到底好不好?因类而异,因使用的语境而异!你总有需要它的时候,也有不许要它的时候,语言默认是有这项功能的。但是,也可以通过关键字explicit阻止这种我们看不到的“优化”!explicit关键字只能用在构造函数身上,并且只需在函数的声明时标注即可,在类函数的定义时不需标注该关键字。

上例中如果阻止借助构造函数A(B b)发生隐式类型转换,可对该构造函数的声明做如下处理:

explicit A (B b)

此时语句a.func(b)就要出错了,但是我们可以显式地使用构造函数,以上例为例,可以使用语句

a.func(A(b))

完成相同的功能,此时不涉及隐式转换。A(b)生成临时A类型对象,并且传递给函数func调用,一切循规蹈矩,没有任何隐式的、程序员看不见的步骤。显示的构造函数中止了隐式地使用构造函数,任何构造函数都可以显式地创建临时对象,这是它的权利,被explicit修饰的构造函数也不例外。

对于隐式类类型转换,《C++ Primer》作者有如下心得:通常,除非有明显理由要定义隐式转换,否则,单形参构造函数应该为explicit。将构造函数设置为explicit可以避免错误,并且当转换有用时,用户可以显式地构造对象。

上一篇:OpenCV实现拼图板小游戏

栏    目:C代码

下一篇:C语言实现仓库物资管理系统

本文标题:《C++ Primer》隐式类类型转换学习整理

本文地址:http://www.codeinn.net/misctech/149583.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有