gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章《C++ Primer》隐式类类型转换学习整理由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

?
1
2
3
4
5
6
7
8
9
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)发生隐式类型转换,可对该构造函数的声明做如下处理:

?
1
explicit A (B b)

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

?
1
a.func(A(b))

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

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

到此这篇关于《C++ Primer》隐式类类型转换学习整理的文章就介绍到这了,更多相关c++隐式类类型转换内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://blog.csdn.net/honpey/article/details/9018429 。

最后此篇关于《C++ Primer》隐式类类型转换学习整理的文章就讲到这里了,如果你想了解更多关于《C++ Primer》隐式类类型转换学习整理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com