在C++中,我们有时可以将构造函数用作自动类型转换函数(构造函数)。但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++新增了关键字explicit,用于关闭这种自动特性。即被explicit关键字修饰的类构造函数,不能进行自动地隐式类型转换,只能显式地进行类型转换。跟它相对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。
demo1
#include <iostream>
#include <string>
using namespace std;
class student
{
public:
student(int _age)
{
this->age = _age;
cout << "arg=" << age << endl;
}
student(int _age, const string _name)
{
this->age = _age;
this->name = _name;
cout << "age=" << age << "; name=" << name << endl;
}
~student()
{
}
int getAge()
{
return age;
}
string getName()
{
return name;
}
private:
int age;
string name;
};
int main(void)
{
student xiaoM(18); /* 显示构造 */
student xiaoW = 18; /* 隐式构造 */
student xiaoHua(19, "小花"); /* 显示构造 */
student xiaoMei = { 18, "小美" }; /* 隐式构造 初始化参数列表, C++11 前编译不能通过, C++11 新增特性 */
system("pause");
return 0;
}
demo2
#include <iostream>
#include <string>
using namespace std;
class student
{
public:
explicit student(int _age)
{
this->age = _age;
cout << "arg=" << age << endl;
}
explicit student(int _age, const string _name)
{
this->age = _age;
this->name = _name;
cout << "age=" << age << "; name=" << name << endl;
}
~student()
{
}
int getAge()
{
return age;
}
string getName()
{
return name;
}
private:
int age;
string name;
};
int main(void)
{
student xiaoM(18); /* 显示构造 */
//student xiaoW = 18; /* 隐式构造 --error*/
student xiaoHua(19, "小花"); /* 显示构造 */
//student xiaoMei = { 18, "小美" }; /* 隐式构造 --error 初始化参数列表, C++11 前编译不能通过, C++11 新增特性 */
system("pause");
return 0;
}
这样的话隐式就会报错,显示就会没问题。