一、、explicit
#pragma once
#include <iostream>
class explicit_test
{
public:
//只是想让他支持 int 类型来分配大小,
/*explicit*/ explicit_test(int length, const char* data = "")
{
std::cout << "explicit_test(int length,const char* data = "");\n";
}
explicit_test& operator =(const explicit_test& other)
{
std::cout << "explicit_test& operator=(const explicit_test& other);\n";
return *this;
}
};
不带explicit 测试结果
explicit_test aa(5); //直接隐式转换,可以传一个参数是因为该构造函数的第二个参数有默认值
aa = 34.3;
aa = 'a';
上面让我们感觉到歧义,分不清是这个类是干啥用的额,不知道为啥float,chat也可以正常调用ctor,可以肯定的是,这种不是转换不是我们想要的。
我们在看看 带有explicit 的结果:
explicit_test aa(5); //直接隐式转换,可以传一个参数是因为该构造函数的第二个参数有默认值
aa = 34.3;
aa = 'a';
//在explicit_test构造函数加explicit 会报错
//1>f:\owersource\c++_test\c++_test\c++_test.cpp(11) : error C2679 : 二进制“ = ” : 没有找到接受“double”类型的右操作数的运算符(或没有可接受的转换)
// 1> f:\owersource\c++_test\c++_test\explicit.h(14) : 可能是“explicit_test &explicit_test::operator =(const explicit_test &)”
// 1> 尝试匹配参数列表“(explicit_test, double)”时
// 1>f:\owersource\c++_test\c++_test\c++_test.cpp(12) : error C2679 : 二进制“ = ” : 没有找到接受“char”类型的右操作数的运算符(或没有可接受的转换)
// 1> f:\owersource\c++_test\c++_test\explicit.h(14) : 可能是“explicit_test &explicit_test::operator =(const explicit_test &)”
//这才是我们想要的结果,我可以把有可能未知的逻辑错误控制编译期。
//从上面看 explicit 是抑制隐式转换的。除非是在你有意进行隐式转换,否则最好cotr都加上explicit来控制隐式转换,让他转换在我们可预期范围。
结论:在你不是有意的情况下,都应该加explicit