隐式类型转换

先看看什么情况下是隐式类型转换:
#include<iostream>  
#include <string>
#include <vector>
using namespace std;


class Conversion{
public:
	Conversion(string s)
	{
		sdata = s;
		idata = 0;
	}
	Conversion & combine(const Conversion& oldC){
		sdata = sdata + oldC.getSdata();
		cout << sdata << endl;
		return *this;
	}
	const string getSdata() const { return sdata; }
private:
	string sdata;
	int idata;
};

int main()
{
	string str = "abc";
	Conversion test("def");  
	test.combine(str);<span style="font-family: Arial, Helvetica, sans-serif;">//本来应该接受Conversion类型的参数,但是string类型的参数也可以</span>
	return 0;
}

编译器只会自动执行一步类型转换,下面这种写法就是错误的:

test.combine("abc");
第一步,将"abc"转换成string

第二部,将string转为Conversion

可以显示的将字符串转换为string:

test.combine(string("abc"));


我们可以通过将构造函数声明为explicit加以阻止。

explicit Conversion(string s)
	{
		sdata = s;
		idata = 0;
	}
这样,隐式转换的那句无法通过编译。

关键字explicit只对一个实参的构造函数有效。需要多个实参的构造函数不能用于执行隐式转换,所以无需将这些构造函数指定为explicit的。

注意:explicit构造函数只能用于直接初始化,不能用于拷贝形式的初始化。

	Conversion test2 = string("abc");  //错误,不能将explicit构造函数用于拷贝形式的初始化过程
	Conversion test1(string("abc"));   //正确,直接初始化

可以为转换显示地使用构造函数:

test.combine(Conversion("abc"));  //使用构造函数显示地强制转换


标准库中含有显式构造函数的类:

接受一个单参数的const char*的string构造函数不是explicit的。

接受一个容量参数的vector构造函数是explicit的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值