简介: explicit是个C++关键子,但是关注过它的人远远没有其他关键字的多,但是往往忽略了它,就会在一些不经意的地方造成错误,而花费更多的时间去寻找.
explicit可以抑制内置类型隐式转换,所以在类的构造函数中,最好尽可能多用explicit关键字,防止不必要的隐式转换.
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
简述:
explicit是个C++关键子,但是关注过它的人远远没有其他关键字的多,但是往往忽略了它,就会在一些不经意的地方造成错误,而花费更多的时间去寻找.
explicit可以抑制内置类型隐式转换,所以在类的构造函数中,最好尽可能多用explicit关键字,防止不必要的隐式转换.
原文:
看下下面这个例子:
#include <iostream>
using namespace std;
class A
{
public:
A(int i = 5)
{
m_a = i;
}
private:
int m_a;
};
int main()
{
A s;
//我们会发现,我们没有重载'='运算符,但是去可以把内置的int类型赋值给了对象A.
s = 10;
//实际上,10被隐式转换成了下面的形式,所以才能这样.
//s = A temp(10);
system("pause");
return 0;
}
我们发现成员变量的值被修改了.
由此可知:当类构造函数的参数只有一个的时候,或者所有参数都有默认值的情况下,类A的对象时可以直接被对应的内置类型隐式转换后去赋值的,这样会造成错误,所以接下来会体现出explicit这个关键词的作用.
#include <iostream>
using namespace std;
class A
{
public:
//这里用explicit关键词来修饰类构造函数.
explicit A(int i = 5, int j = 10)
{
m_a = i;
m_b = j;
}
private:
int m_a;
int m_b;
};
int main()
{
A s;
//这样直接赋值,会被提示错误,因为explicit抑制隐式转换的进行
s = 10;//这样会报错!!!
//当然显示转换还是可以的.
s = A(20);
system("pause");
return 0;
}
通过两个例子我们知道:explicit可以抑制内置类型隐式转换,所以在类的构造函数中,最好尽可能多用explicit关键字,防止不必要的隐式转换.