C++中explicit关键字和implicit关键字的使用

来源:互联网 发布:加藤小雪相貌知乎 编辑:程序博客网 时间:2024/06/05 03:05

http://blog.sina.com.cn/s/blog_149e9d2ec0102wyk7.html


在编程过程中, 我们习惯上使用explicit或者implicit关键字实现构造函数的显或者隐式显示。


explicit关键字:只能修饰只有一个参数的构造函数,或者有多个参数,但是除第一个参数外其他的参数都有默认值。它的作用是表明构造函数是显式方式显示的。
implicit关键字:与explicit对应,他表示隐式的进行数据转换。注:C++中不存在这个关键字,C#等编程语言中才有,此处仅仅是为了说明。

首先我们看一下显式声明构造函数,然后看一下隐式构造函数,进而可以对比两者之间的差别,我们来看下一个例子。

#include

class Data{
public:
int _cSizeCount;
Data(int cSize){
this->_cSizeCount = sizeof(cSize);
}
Data(const char* p){
this->_cSizeCount = sizeof(p);
}
void Display(){
std::cout << "字节长度:" << this->_cSizeCount << std::endl;
}
};
int main()
{
Data d1(10);//程序执行成功,调用第一个默认构造函数,
Data d2 = 11;//程序执行成功,C++执行一个缺省的转化操作,

Data d3("hello");//程序执行成功,
Data d4 = "world";//程序执行成功,
Data d5 = 'A';//程序执行成功,
return 0;
}

我们观察Data d2 = 11;这一句也是执行成功的,因为C++会执行一个缺省的转化操作:将该结构函数对应的数据类型转换为该类对象。就是说这段代码相当于Data d2(11), 编译器会自动将整型转换成Data类的对象。

这样的转换显然就是默认转换了,如果我们想要让它显式的转换,那么这样的形式就是错误的,如果进行显示转换我们需要使用关键字explicit。
具体代码让我们看一下。
#include

class Data{
public:
int _cSizeCount;
explicit Data(int cSize){
this->_cSizeCount = sizeof(cSize);
}
Data(const char* p){
this->_cSizeCount = sizeof(p);
}
void Display(){
std::cout << "字节长度:" << this->_cSizeCount << std::endl;
}
};
int main()
{
Data d1(10);//程序执行成功,调用第一个默认构造函数,
Data d2 = 11;//程序执行成功,C++执行一个缺省的转化操作,

Data d3("hello");//程序执行成功,
Data d4 = "world";//程序执行成功,
Data d5 = 'A';//程序执行成功,
return 0;
}

如果此时我们编译程序就会发现,程序出现错误,错误原因是:
1.  cannot convert from 'int' to 'Data' Constructor for class 'Data' is declared 'explicit'.
2.  cannot convert from 'char' to 'Data' Constructor for class 'Data' is declared 'explicit'
对应错误代码就是这样两行:
Data d2 = 11;
Data d5 = 'A';
因为我们声明称显式转换形式,所以默认的隐式转换将不合适。所以出现错误提示。

如果explicit关键字修饰的类构造函数的参数大于1个呢?并且其他的参数也不是默认初始化。那么即便你是用关键字explicit那么也不会实现显式转换。
比如:
class Data{
public:
int _cSizeCount;
explicit Data(int cSize, int temp){
this->_cSizeCount = sizeof(cSize);
}
Data(const char* p){
this->_cSizeCount = sizeof(p);
}
void Display(){
std::cout << "字节长度:" << this->_cSizeCount << std::endl;
}
};

我们在最前面已经说过当类构造函数中有多个参数,但是除第一个参数外其他的参数都有默认值。它的作用是表明构造函数是显式方式显示的。我们来看一个事例代码:
#include

class Data{
public:
int _cSizeCount;
explicit Data(int cSize, int temp=0){
this->_cSizeCount = sizeof(cSize);
}
Data(const char* p){
this->_cSizeCount = sizeof(p);
}
void Display(){
std::cout << "字节长度:" << this->_cSizeCount << std::endl;
}
};
int main()
{
Data d1(10, 0);//程序执行成功,调用第一个默认构造函数,
Data d2 = 11;//程序执行成功,C++执行一个缺省的转化操作,

Data d3("hello");//程序执行成功,
Data d4 = "world";//程序执行成功,
Data d5 = 'A';//程序执行成功,
return 0;
}

同样代码中这两行还是会出现错误的。
Data d2 = 11;
Data d5 = 'A';
也是因为我们定义了显式的方式转换,而这两句使用的是隐式的转换方式。当然我们还可以通过显式转换的代码进行转换,比如这两句我们可以写成:
Data d2 = Data(11);
Data d5 = Data('A');
这样写就进行的是显式转换。

需要注意的是:explicit只需要声明在类里,否则在外部声明会出现报错。

原创粉丝点击