C++中的类类型转换分析

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节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值