# explicit修饰符
# 为什么引入explicit
关键字?
在没有显式函数说明符explicit
的情况下, 构造函数有时候会变成转换构造函数,在编程过程中发生隐式的类型转换,有时候可能并不是我们需要的。
explitct
关键字的引入就是为了修饰构造函数,使得其不会进行隐式的类型转换。
# 示例
#include <iostream>
class Box {
public:
Box(int x, int y=0)
{
x_ = x;
y_ = y;
}
int x_;
int y_;
};
void printBox(const Box &b) {
std::cout << b.x_ << " " << b.y_ << std::endl;
}
int main(int argc, char **argv)
{
Box b1 = 1;
std::cout << b1.x_ << " " << b1.y_ << std::endl; // 1, 0
Box b2 = (1,2);
std::cout << b2.x_ << " " << b2.y_ << std::endl; // 2, 0
printBox(2); // 2, 0
return 0;
}
在以上代码的main
函数中,Box b1 = 1;
和Box b2 = (1,2);
及printBox(2);
都会让代码阅读者感到十分困惑,虽然能正常编译,但者违反了C++
是强类型语言的特征。
为了避免其进行隐式的数据类型转换,可在Box
类的构造函数前加上explicit
修饰。
class Box {
public:
explicit Box(int x, int y=0)
{
x_ = x;
y_ = y;
}
int x_;
int y_;
};
加上explicit
后,上述代码编译的时候就会报错
invalid initialization of reference of type ‘const Box&’ from expression of type ‘int’