1、对下面两行代码具体过程分析。
string str1 = "aaa";
string str2 = string("bbb");
str1的初始化过程:隐式调用string类的接受一个char *的有参构造函数构造一个临时对象,然后调用移动或拷贝构造函数将临时对象拷贝给str1,最后将临时对象析构。
str2的初始化过程:显式调用string类的接受一个char *的有参构造函数构造一个临时对象,然后调用移动或拷贝构造函数将临时对象拷贝给str2,最后将临时对象析构。
2、使用以下代码验证上面的过程。
注意不要在visual studio中实验,因为vs会做优化,得不到上面的过程。对于优化可以参考https://blog.youkuaiyun.com/J_H_C/article/details/82290228
class Test
{
public:
Test()
{
cout << "无参构造函数!" << endl;
}
Test(int t)
{
num = t;
cout << "有参构造函数!" << endl;
}
Test(string str)
{
this->str = str;
cout << "有参构造函数!" << endl;
}
Test(const Test& t_arg)
{
num = t_arg.num;
str = t_arg.str;
cout << "拷贝构造函数!" << endl;
}
~Test()
{
cout << "析构函数!" << endl;
}
private:
int num = 0;
string str;
};
int main()
{
Test t1;
Test t2(t1);
Test t3 = 2;
//Test t4 = "aaa";
Test t5 = Test("bbb");
system("pause");
return 0;
}
在vscode中编译结果如下:
3、将t4的注释去掉,在visual studio 2015中能够成功编译。但是在vs code中编译出错如下:
分析vs code出现的问题:按照1中的分析,"aaa"会调用构造函数Test(string str),但是错误提示显示调用的是构造函数Test(int t)。这是因为从''aaa"到string就需要1中的过程,即调用string的接受一个char *的有参构造函数,把"aaa"转成string。这样就得不到临时的Test对象来初始化t4。所以,"aaa"不会调用构造函数Test(string str),再在其余的只有一个参数的构造函数中查找,就会试图调用构造函数Test(int t),从而出现上面的错误。
按照上面的分析,Test t4 = "aaa";这句是有问题的,不知道visual studio 2015为什么能成功运行!
=====》可以参考《C++ Primer》P263 7.5.4节