C++ explicit关键字的作用主要是用来修饰类的构造函数,表明该构造函数是显式的,禁止单参数构造函数的隐式转换。
如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
class MyClass
{
public:
MyClass(int num);
}
MyClass my = 10;
上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作:
MyClass temp(10);
MyClass obj = temp;
上面的所有的操作即是所谓的“隐式转换”。
class MyClass
{
编译和运行截图:
如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
class MyClass
{
public:
MyClass(int num);
}
MyClass my = 10;
上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作:
MyClass temp(10);
MyClass obj = temp;
上面的所有的操作即是所谓的“隐式转换”。
如果要避免这种自动转换的功能,可以在声明构造函数的时候前面添加上explict关键字,将类的构造函数声明为“显示”,这样就可以防止这种自动的转换操作。
class MyClass
{
public:
explicit MyClass(int num);
};
为了验证这个功能,特做如下测试:
(--------------------1 构造函数前不加explicit---------------------)
#include <iostream>
/********define********/
#ifndef MY_CLASS_H
#define MY_CLASS_H
class MyClass{
public:
MyClass(int);
};
#endif
/********class*********/
MyClass::MyClass(int i)
{
std::cout<<"i="<<i<<std::endl;
}
/********main**********/
int main(int argc,char **argv)
{
MyClass my=10;
return 0;
}
编译和运行截图:
(------------------------2 构造函数前加explicit-------------------)
#include <iostream>
/********define********/
#ifndef MY_CLASS_H
#define MY_CLASS_H
class MyClass{
public:
explicit MyClass(int);
};
#endif
/********class*********/
MyClass::MyClass(int i)
{
std::cout<<"i="<<i<<std::endl;
}
/********main**********/
int main(int argc,char **argv)
{
MyClass my=10;
return 0;
}
编译报错,如图所示:
可知,c++构造函数前的explicit正是上面所说的功能。