c++ 编译器会绕过拷贝构造函数
2016-05-22 15:39
411 查看
C++ primer P442 P447:在拷贝初始化过程中,编译器可以跳过拷贝构造函数,直接创建对象。即,编译器允许将下面的代码
改写为
由于string的构造函数不是一个explicit的,所以说string类型允许从const char* 到string的隐式转换。
在行1中,首先将"999"隐式转化为一个string的临时对象,然后应该调用string的拷贝构造函数对null_book初始化。即
在这里编译器会进行优化,跳过拷贝构造函数直接创建对象。使临时变量成为所要创建的对象。
类似的下面代码也会跳过拷贝构造函数
但是在这种情况下,拷贝构造函数必须是public的,否则编译会不通过。可能是因为如果拷贝构造函数是private的话,编译器会理解为不能够使用拷贝构造函数,进而不会进行这种优化。
string null_book = "999"; //1
改写为
string null_book("999"); //2
由于string的构造函数不是一个explicit的,所以说string类型允许从const char* 到string的隐式转换。
在行1中,首先将"999"隐式转化为一个string的临时对象,然后应该调用string的拷贝构造函数对null_book初始化。即
string temp_str("999"); string null_book = temp_str; //或者 string null_book(temp_str);
在这里编译器会进行优化,跳过拷贝构造函数直接创建对象。使临时变量成为所要创建的对象。
类似的下面代码也会跳过拷贝构造函数
string str = string();
但是在这种情况下,拷贝构造函数必须是public的,否则编译会不通过。可能是因为如果拷贝构造函数是private的话,编译器会理解为不能够使用拷贝构造函数,进而不会进行这种优化。
相关文章推荐
- vs2010 mfc c++ 多线程
- C++ map容器 学习笔记
- 排列组合n选m C++实现
- c++ primer(第五版)学习笔记及习题答案代码版(第九章)顺序容器
- C++面向对象编程分享11----系统设计01
- c++作业6
- 关于求一个数的阶乘的C语言
- c++ 中__declspec 的用法
- ubuntu下安装eclipse(c++)
- C语言知识点总结
- C语言 抽象数据类型ADT
- c++作业六
- 浅谈C语言中结构体的初始化
- 通过引用计数实现智能指针(C++ Primer)
- C++课堂作业(2)
- C++课堂作业(2)
- c++实验6——数组合并
- Ubuntu 14 g++ 使用c++11特性报错
- 单链表及其基本操作(C语言实现)
- C语言基本数据类型大小