【问题标题】:C++ - Competing cast/assignmentC++ - 竞争演员/分配
【发布时间】:2018-02-26 15:54:13
【问题描述】:

如果我有 2 个类 AB 并希望实现从 AB 的转换,我可以看到 2 种可能性。


第一种可能性

class A {
    // Some attributes, methods
    operator B() const {
        // Conversion from A to B
    }
}

class B {
    // Some attributes, methods
}

第二种可能性

class A {
    // Some attributes, methods
}

class B {
    // Some attributes, methods
    B& operator =(const A& src) {
        // Conversion from A to B
    }
}

这两种方法都允许运行以下代码:

执行的代码

A instA;
B instB;

instB = instA; // Ok

现在让我们假设我实现了这两个函数(在类A 中转换为B 和从A 在类B 中的operator =

第三种可能性

class A {
    // Some attributes, methods
    operator B() const {
        // Conversion from A to B - Code 1
    }
}

class B {
    // Some attributes, methods
    B& operator =(const A& src) {
        // Conversion from A to B - Code 2
    }
}

假设 Code 1Code 2 具有相同的效果(甚至不同的效果,为什么不)。

我的问题是:

  • 如果提供了相互竞争的强制转换/赋值方法,那么在进行隐式强制转换时会首先选择哪一个?
  • 是否有兴趣实现这两种相互竞争的强制转换/分配方法?
  • B()A 的转换运算符中调用B 类的operator = 或许是个好主意?

【问题讨论】:

标签: c++ casting operator-overloading implicit-conversion


【解决方案1】:

如果提供了相互竞争的强制转换/赋值方法,那么在进行隐式强制转换时会首先选择哪一个?

根据选择,operator=() 将被优先考虑,因为它不需要转换参数 RHS。

是否有兴趣实现这两种相互竞争的强制转换/分配方法?

没有。最好避免这样做以防止混淆。

B()A 的转换运算符中调用B 类的operator = 或许是个好主意?

如果您必须同时支持两者,那么,是的,这样做是个好主意。

【讨论】:

  • 感谢您的回答。对于最后一点,我真正的意思是 in,而不是 and。另一个问题:你能重载原生类型(int、long 等)的operator = 来设置你自己的类的转换吗?
  • @BenjaminBarrois,如果你的意思是int i; B b; i = b;,不,你不能那样做。
  • 那么如何解释下面代码的执行?onlinegdb.com/S1nk_nZOG
  • @BenjaminBarrois,这不是operator= 过载。它是用户定义的转换运算符。是的,该语言绝对支持这一点。
  • 哦,好吧,对不起,我以为你说一般情况下不可能做到int i; B b; i = b;
猜你喜欢
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多