初始化的拷贝形式和直接形式有所不同:直接初始化直接调用与实参匹配的 构造函数,拷贝初始化总是调用拷贝构造函数。拷贝初始化首先使用指定构造函数创建一个临时对象,然后用拷贝构造函数将那个临时对象拷贝到正在创建的对象。

string str1("I am a string");//语句1 直接初始化
string str2(str1);//语句2 直接初始化,str1是已经存在的对象,直接调用构造函数对str2进行
初始化
string str3 = "I am a string";//语句3 拷贝初始化,先为字符串”I am a string“创建临
时对象,再把临时对象作为参数,使用拷贝构造函数构造str3
string str4 = str1;//语句4 拷贝初始化,这里相当于隐式调用拷贝构造函数,而不是调用赋值运
算符函数

就完全等价于直接初始化了(语句1和语句3等价),但是需要辨别两种情况。

  • 当拷贝构造函数为private时:语句3和语句4在编译时会报错
  • 使用explicit修饰构造函数时:如果构造函数存在隐式转换,编译时会报错