- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
目录 1. 数组概述 1.1 数组的定义 1.2 数组的声明 1.3 复合类型的数组 1.4 数组的初始化规则
我在 C++ Primer Plus 书中第 6 章的第 7 个练习中遇到了一些问题。好吧,我认为我把这个练习做得很好,但我的编译器不这么认为。该程序应计算单词开头的元音、辅音和其他字符的数量。问题是
目录 前言 类型转换 变量声明与定义的关系 变量命名规范 复合类型 引用 指针 const限
C++ Primer中有这样一句话:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个转换。这句话用下面一段代码表示为: ?
第1章 快速入门 1,介绍main函数的意义和其基本结构,return语句。不同平台下编译与执行程序。 2,两个类isrteam与otream与它们的实例对象cin,cout,cerr,clog。
在下一个示例(由documentation提供)中: 我收到此错误: Type 'FunctionComponent & { size: [16, 16]; }' is missing the fo
以下摘自 的第 7.6 章作者:Stanley B. Lippman Josée Lajoie。 A function specified as inline is expanded "in lin
在 C++ Primer 5th Edition 中,有一个关于引用和 const 的部分,在第 97-98 页: const int temp = dval; // create a tempo
我正在关注这本书 - C++ Primer用于学习C++。我在介绍类的章节中间,我一直在解决包含两个类的头文件的问题。 这是两个类和头文件: 屏幕Cls.h: #ifndef SCREENCLS_H
我正在学习“C Primer Plus”,刚刚完成了编程练习,但我在第五章(运算符、表达式和语句)的最后一节上碰壁了。 练习是: 编写一个程序,请求用户输入华氏温度。该程序应将温度读取为 double
Closed. This question is off-topic。它当前不接受答案。
很抱歉转向这里提出这样一个基本问题,但有人可以快速为我解决这个问题吗?然后我会删除线程,以免造成新手困惑。 在以下来自 C++ Primer Plus 文本的示例中,函数声明中的 & 运算符是否指定函
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: GCC linker can’t find standard library? 我想弄乱我在假期得到的这本
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 7年前关
我目前正在学习《C++ Primer》(第 5 版),并且正在努力弄清楚作者在这部分文字中的含义(第 2 章,第 2.1.3 节): ... By default, decimal literals
我正在尝试切换到 Primer design system , 我正在使用 Bootstrap现在。在不实际更改任何内容的情况下进行切换是否安全? 最佳答案 应该是安全的。 在切换到您要使用的 Pri
在 C++ primer 5 Ed 第 12 章中:动态内存。据说:“静态对象在它们之前被分配被使用,并在程序结束时被销毁。” 这是否意味着全局对象在控制通过它们的声明之前被定义和初始化。 我有这个例
为什么 ArrayTP eggweights; ArrayTP donuts;生成两个单独的类,但是 Stack eggs(12); Stack dunkers(13)只生成一个声明?他们不应该是两堆
我正在阅读这本书中关于字符串和文字的第 86 页,但我不明白为什么它会说以下关于字符串 s1 和 s2 的内容。 string s1("hello, "); string s2("world\n")
问题在评论里! 代码: auto beg = text.begin(), end = text.end(); auto mid = text.begin() + (end - beg) / 2; w
我是一名优秀的程序员,十分优秀!