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