重载布尔转换和取消引用对象指针

class D{
    bool var;
public:
    D(bool x): var(x) {}
    operator bool(){return var;}
};

int main() {
    D* temp1 = new D(false);
    cout << *temp1;  //0

    D* temp2 = new D(true);
    cout << *temp2;  //1
    return 0;
}

我正在尝试重载对象 D 的 bool 转换。然后我发现重载的 bool 转换与取消引用对象指针时的值之间存在关系。

我用不同的值初始化了 2 个对象。当我尝试取消引用指针时,我看到它们返回与重载 bool 转换相同的值。 重载 bool 转换和取消引用对象指针之间有什么关系?

yangleilgone 回答:重载布尔转换和取消引用对象指针

您正在打印将 D 对象转换为 bool 的结果:

  • 引用 D* 会给你一个 D 类型的值。
  • 当您编写 cout << *temp1 时,语言会查找 operator<< 重载,该重载将 std::ostream 作为其左侧操作数,并将 D 类型的对象作为它的右手操作数。
    • 没有这样的重载,但是有一个重载,它采用类型为 bool 的右手操作数。
    • 由于 Dbool 可以隐式转换为 operator bool,因此在这种情况下选择 std::ostream::operator<<(bool) 作为最佳的 << 运算符重载。

该特定运算符将 0 插入 std::ostreamfalse 值并插入 1 以获得 true 值(除非 std::boolalpha 操纵符具有之前已应用于流)。因此,由于 static_cast<bool>(*temp1)falsecout << *temp1 打印 0 并且由于 static_cast<bool>(*temp2)true cout << *temp2 打印 1 .

,

重载 bool 转换和取消引用对象指针之间有什么关系?

当你间接通过对象指针时,结果是对象的左值。当您将隐式转换运算符定义为 bool 时,该对象可转换为 bool。这就是正在发生的事情:您正在使用转换运算符,并且转换的结果作为参数传递给流插入运算符。

本文链接:https://www.f2er.com/3578.html

大家都在问