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]# 




猜你喜欢

转载自blog.csdn.net/idwtwt/article/details/80642650