对隐式类型转换保持警觉

  1. 操作符重载引起的隐式类型转换
    缺点:可能导致非预期的函数被调用
    解决:以功能对等的另一个函数取代类型转换操作符
    举例:
    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(num_/deno_);
}
};

  1. 类型转换构造函数引起的隐式类型转换
    解决方案: 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& lhs,
const Array& rhs);
...
};

Array a(10); //对象调用int转换为ArraySize,再转换为Array的隐式转换行为是被允许的
Array b(10);
for(int i = 0; i < 10;++i)
if(a == b[i])... //如此类内部需要调用两个用户定制转换行为,一个将int转换为ArraySize,
//另一个将ArraySize转换为Array,如此的隐式转换是被禁止的

posted @ 2025-11-10 17:40  冰凌蔷薇  阅读(0)  评论(0)    收藏  举报