来自不同类型的C ++默认赋值运算符

时间:2017-07-31 13:26:56

标签: c++ operator-overloading operators

我将以下类作为基本类型bool的包装器:

class MyBoolean {
public:
    MyBoolean(bool value = false):value(value) {};
    virtual ~MyBoolean() {};

    void MySpecialFunction();
    ...

private:
    bool value;
}

我想在表达式中使用MyBoolean作为普通bool。也就是说,分配给它,比较等。为此,我定义了赋值和隐式类型转换运算符。

inline operator bool() const {
    return value;
}
inline bool operator = (const bool &rhs) {
    return value = rhs;
}

然而,似乎不需要赋值赋形符。以下代码仅使用类型转换运算符进行编译,而不使用赋值运算符:

MyBoolean b;
b = true;

为什么编译器没有抱怨它无法将bool分配到MyBoolean? C ++中不同类型的赋值运算符的默认实现是什么?

3 个答案:

答案 0 :(得分:3)

构造函数MyBoolean(bool value = false)是“converting constructor”,允许编译器使用这样的一个生成一个隐式转换(在本例中来自boolMyBoolean)。

如果您不希望构造函数用于隐式转换,则将其声明为explicit - 如

explicit MyBoolean(bool value = false)

答案 1 :(得分:2)

您不需要赋值运算符的原因是因为您有非显式converting constructor。当你这样做

b = true;

编译器发现它可以使用

true转换为MyBoolean
MyBoolean(bool value = false):value(value) {};

由于您获得了一个用户提供的转换,编译器构造一个临时MyBoolean,然后使用默认的复制赋值运算符将其分配给b

答案 2 :(得分:0)

执行b = true后,它会生成新的MyBoolean

MyBoolean b;
b = true;

评估到

MyBoolean b;
b = MyBoolean(true);

这称为implicit type conversion