第三节 · 换一种交流的方式 · 成员访问运算符定义

类型转换运算符允许对象隐式或显式地转换为其他类型,就像内置类型之间的转换一样。


基本语法

class Integer
{
private:
    int value;
    
public:
    Integer(int v = 0) : value(v) {}
    
    // 类型转换运算符
    operator int() const
    {
        return value;
    }
};

int main()
{
    Integer a(42);
    
    int n = a;           // 隐式转换
    int m = (int)a;      // C 风格显式转换
    int k = static_cast<int>(a);  // C++ 风格
    
    cout << n + 10 << endl;  // 52
    
    return 0;
}

隐式转换的危险


explicit 类型转换

C++11 引入 explicit 来防止隐式转换。


智能指针的 bool 转换


转换为指针类型


多重转换


转换构造函数 vs 转换运算符

选择原则

  • 如果目标类型是你的类,用转换构造函数

  • 如果源类型是你的类,用转换运算符


字符串转换


避免歧义


习题

  • 解释 explicit operator bool() 的特殊规则。

  • 设计一个 Ratio 类,支持转换为 double

  • 什么时候应该用转换运算符,什么时候用命名函数?

Last updated