对隐式类型转换保持警觉
- 操作符重载引起的隐式类型转换
缺点:可能导致非预期的函数被调用
解决:以功能对等的另一个函数取代类型转换操作符
举例:
class Rational{
public:
Rational(int num = 0,int deno = 1):num_(num),deno_(deno){};
operator double() const{
return static_cast(num_/deno_);
}
private:
int num_;
int deno_;
};
Rational r(1,2);
cout << r; //Rationl隐式转换为double类型,可能非预期的行为
使用asDouble()函数取代:
class Rational{
public:
...
double asDouble() const{
return static_cast
}
};
- 类型转换构造函数引起的隐式类型转换
解决方案: 1、使用C++新特性 explicit,仅支持显式转换
2、类包含一个以上的“用户定制行为”
template
class Array{
public:
class ArraySize{
public:
ArraySize(inr num):theSize(num){}
int size() const{return theSize;};
private:
int theSize;
};
Array(int lowBound,int highBound);
Array(ArraySize size);
bool operator==(const Array
const Array
...
};
Array
Array
for(int i = 0; i < 10;++i)
if(a == b[i])... //如此类内部需要调用两个用户定制转换行为,一个将int转换为ArraySize,
//另一个将ArraySize转换为Array
浙公网安备 33010602011771号