c++ 编译器会绕过拷贝构造函数

Posted uangyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 编译器会绕过拷贝构造函数相关的知识,希望对你有一定的参考价值。

C++ primer P442 P447:在拷贝初始化过程中,编译器可以跳过拷贝构造函数,直接创建对象。即,编译器允许将下面的代码 

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的话,编译器会理解为不能够使用拷贝构造函数,进而不会进行这种优化。

 

以上是关于c++ 编译器会绕过拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章

拷贝构造函数

C++空类编译器自动生成的6个成员函数关于构造函数拷贝构造函数的解释

深度分析C++默认构造函数拷贝构造函数

C++的拷贝构造函数的四种调用

C++类和对象中

构造函数的调用规则