Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475
目录* 目标代码

  • 构造函数定义的隐式类型转换
  • 分析a1
  • 分析a2
  • 分析a3

1|0目标代码

旨在弄懂下面的代码,明确变量a1,a2,a3在创建时编译器究竟干了那些事:

#include
using namespace std;class A{
public:int x;A() {cout<<"A()"<<endl;}A(int i) : x(i){cout<<"A(int i)"<<endl;}A(const A &ra) : x(ra.x) {cout<<"A(const A&)"<<endl;}void operator=(const A&){cout<<"operator="<<endl;}
};
int main(){cout<<"the assignment of a1 : "<<endl;A a1;a1 = 2;cout<<"the copy initialization of a2 : "<<endl;A a2 = 2;cout<<"the direct initialization of a3 :"<<endl;A a3(a1);return 0;
}

运行结果:

2|0构造函数定义的隐式类型转换

任何只接受一个参数的构造函数,都隐式地定义了由该参数向该类型的隐式类型转换

A(int i)定义了一个由int向A的隐式类型转换

所以,在任何使用A对象的地方,可以用一个int代替,此时,int会转换为一个A类型临时变量

如对a1变量的赋值操作:

A a1; //声明a1,a1被默认初始化
a1 = 2; //2转换为A类型的临时变量,对a1进行赋值操作

对于隐式类型转换,需要注意两点:

  1. 隐式类型转换只允许一步转换
class B{
public:string B\_s;B() = default;B(string s) : B\_s(s){};
};
int main(){B b1,b2;//错误:char*->string->B,进行了两步转换b1 = "hello"; b2 = string("hello");return 0;
}
  1. 接受隐式类型转换得到的对象的函数,参数传递方式必须是const引用传递

因为c++中,一般不修改临时对象,所以临时对象只能传递给const引用

3|0分析a1

A a1:

a1进行默认初始化,调用默认构造函数A()

a1 = 2

  1. 字面量2隐式转换为A类型的临时对象
  2. 该临时对象通过拷贝运算符operator=拷贝给a1
  3. 因为是临时对象,所以operator=必须接受const引用,否则造成编译错误

4|0分析a2

A a2 = 2

  1. 字面量2隐式转换为A类型的临时对象
  2. 用临时对象来拷贝初始化a2,调用拷贝构造函数A(const A&),相当于A a2(A(2))
  3. 因为是临时对象,所以拷贝构造函数A(const A&)必须接受const引用,否则造成编译错误

特别注意

编译器会将A a2(A(2))优化为A a2(2)

所以程序输出“A(int i)”,而不是“A(const A&)”

但是底层仍然调用了A(const A&),所以如果把A(const A&)改为A(A&),会造成编译错误 error: cannot bind non-const lvalue reference of type 'A&' to an rvalue of type 'A'

这提示我们,在编写c++程序时,如果不改变对象的值,那么习惯性地采用const引用会避免许多难解的编译错误

5|0分析a3

用a1直接初始化a3,调用A(const A&)

__EOF__

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vTFH6q7S-1646068357283)(https://blog.csdn.net/timothy020/p/15948051.html)]萌之上 本文链接:https://blog.csdn.net/timothy020/p/15948051.html关于博主:评论和私信会在第一时间回复。或者直接私信我。版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!声援博主:如果您觉得文章对您有帮助,可以点击文章右下角**【[推荐](javascript:void(0)

c++隐式类型转换存在的陷阱相关推荐

  1. 没有学不会的C++:用户自定义的隐式类型转换

    C++ 中的类型转换包含内建类型的转换和用户自定义类型的转换,而这两者都又可分为隐式转换和显示转换,所以一共有如下四象限表格中的 A.B.C.D 四种情况 隐式转换 显示转换 (casting) 内建 ...

  2. C语言----表达式求值之隐式类型转换

    前言: 表达式求值的顺序一部分是由操作符的优先级和结合性决定. 同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型,称为隐式类型转换,下面给出隐式类型转换的详细讲解,希望对大家有所帮助~ 隐 ...

  3. c++ 隐式类型转换

    隐式类型转换由编译器自动执行,不需程序员介入. 何时发生隐式类型转换 1. 在混合类型的表达式中,操作数会被转换为相同类型 int ival; double dval; ival >= dval ...

  4. float 与 double、隐式类型转换、switch、重写与重载、Java 与 C++ 的区别、JRE or JDK

    1.float 与 double 1.1 字面量属于 double 类型,不能直接将 1.1 直接赋值给 float 变量,因为这是向下转型. // float f = 1.1; Java 不能隐式执 ...

  5. 数据类型,隐式类型转换

     关于数据类型: 1.常量也是有类型的 常量数据大体分两类,一类是带点(实型,浮点型),一类是不带点叫整型. 编译器对带点,通常默认为double,不带点通常编译为int 2.对于数据   .2  ...

  6. ES5-3 循环、引用值初始、显示及隐式类型转换

    1. 循环 for循环的三个参数abc,a只执行一次,c在每次循环后执行 // 打印0-100的质数 1不是质数 var list = [2] for (var i = 3; i <= 100; ...

  7. 《MySQL tips:隐式类型转换与隐式字符编码转换对查询效率的影响》

    维护一个交易系统,交易记录表tradelog包含交易流水号(tradeid).交易员id(operator).交易时间(t_modified)等字段. create table 'tradelog' ...

  8. int转换为cstring_PostgreSQL 隐式类型转换探秘

    个人简介 何小栋, 从事产品研发和架构设计工作,对Oracle.PostgreSQL有深入研究,ITPUB数据库版块资深版主.现就职于广州云图数据技术有限公司,系统架构师,博客:http://blog ...

  9. c语言float转换为int_C语言的隐式类型转换和显示类型转换

    C语言是一种强类型语言,当使用一种类型的对象代替另外一种类型的对象进行操作时,必须首先进行类型转换. 类型转换的方式,一般可分为隐式类型转换和显示类型转换(也称为强制类型转换). 1.隐式类型转换 隐 ...

最新文章

  1. eclipse + maven搭建SSM框架
  2. 【转】推荐10本C#编程的最佳书籍
  3. mysql 插入 point_mysq Point类型 查询和插入操作:insert和select
  4. 用函数判断考试得分:
  5. ARM11---中断---向量中断控制器(VIC)---结合s3c6410
  6. mysql优化连接数防止访问量过高的方法
  7. matlab 莫比乌斯曲面,教你Rhino“3步”快速打造循环曲面“莫比乌斯”
  8. 什么是AHP 层次分析法?
  9. 数据结构之队列(链式队列)的基本操作与实现
  10. Tomcat端口配置(详细)
  11. amigo幸运字符什么意思_OMG,12 个精致的 Java 字符串操作小技巧,学它
  12. 专业英语---短语篇
  13. 若依 / RuoYi-Vue 前后端分离,前端部署及注意事项
  14. 软件模拟SPI接口程序代码
  15. 使用vs2015打开以前版本的.sln工程不兼容的问题
  16. Shiro(三) Shiro核心原理分析
  17. 百度谷歌互刷排名,互刷流量,刷下拉,刷相关搜搜【胖虎图图-互动点击专家】
  18. ERNIE的掩码机制代码解析
  19. 【推荐算法论文阅读】LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation
  20. Get爱康icon诺迪克跑步机,让自律变成一种习惯~

热门文章

  1. Jsoup 抓取和数据页 认识HTTP头
  2. 《精彩绝伦的CSS》读书笔记(二)
  3. Dynamips结合VMware搭建站点到站点×××环境
  4. 深入理解InnoDB(6)—独立表空间
  5. leetcode 80. 删除有序数组中的重复项 II
  6. 编译原理—语义分析(Java)
  7. leetcode93. 复原IP地址(回溯)
  8. 谷歌浏览器bug调试快捷键_Bug压榨初学者指南:如何使用调试器和其他工具查找和修复Bug
  9. scrum流程 规划 冲刺_Scrum –困难的部分2:更快地冲刺
  10. htt://3g.hn_根据我对“询问HN:谁在招聘?”的分析,开发人员技能发展趋势