C++隐式类型转换和explicit关键字

在C++中可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换(单个参数,或多个参数,但除了第一个参数都有默认参数)。如:

#include<iostream>
#include<string>
using namespace std;
class TestExplicit
{
public:
	TestExplicit(int size)
	{
		buff = string(size,'!');
	}
	TestExplicit(string str)
	{
		size = str.size();
		buff = str;
	}
	string getString()
	{
		return buff;
	}
private:
	int size;
	string buff;

};
int main(int argc,char** argv)
{
	//隐式转换,调用构造函数TestExplicit(int size)
	TestExplicit t1 = 10;

	//d调用构造函数TestExplicit(string str)
	TestExplicit t2 = string("Hello World!");

	//隐式转换,易产生无解
	TestExplicit t3 = 'a';
	cout << t1.getString() << endl;
	cout << t2.getString() << endl;
	cout << t3.getString() << endl;

}

输出:

!!!!!!!!!!
Hello World!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[root@localhost c++11]# 

可以看到形参类型int被隐式转换为TestExplicit,是通过条用构造函数TestExplicit(int size)实现的。但是如例子中的t3,如果类用户是希望构造内容为‘a’的TestExplicit对象,则就不是如期所愿了,实质上构建的‘a’大小的TestExplicit,为了杜绝这种问题,C++中引入了explicit关键,用来修改构造函数,禁止隐式转换

#include<iostream>
#include<string>
using namespace std;
class TestExplicit
{
public:
	explicit TestExplicit(int size)
	{
		buff = string(size,'!');
	}
	TestExplicit(string str)
	{
		size = str.size();
		buff = str;
	}
	string getString()
	{
		return buff;
	}
private:
	int size;
	string buff;

};
int main(int argc,char** argv)
{
	//隐式转换,调用构造函数TestExplicit(int size)
	TestExplicit t1 = 10;

	//d调用构造函数TestExplicit(string str)
	TestExplicit t2 = string("Hello World!");

	//隐式转换,易产生无解
	TestExplicit t3 = 'a';
	cout << t1.getString() << endl;
	cout << t2.getString() << endl;
	cout << t3.getString() << endl;

}

被explicit修饰后,构造函数将不能用于隐式转换,编译出错

explicit.cpp: In function ‘int main(int, char**)’:
explicit.cpp:28:20: error: conversion from ‘int’ to non-scalar type ‘TestExplicit’ requested
  TestExplicit t1 = 10;
                    ^
explicit.cpp:34:20: error: conversion from ‘char’ to non-scalar type ‘TestExplicit’ requested
  TestExplicit t3 = 'a';
                    ^
[root@localhost c++11]# 




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值