用operator =(赋值)定义部分副本是个好主意吗?

时间:2012-07-28 08:05:12

标签: c++ operator-overloading

请考虑以下代码段:

class Pin
{
public:
    Pin()
    {
    }
};

class Connection
{
    Pin& _from;
    Pin& _to;

public:
    Connection(Pin& from, Pin& to)
        : _from(from), _to(to)
    {
    }
};

class Device
{
    Pin _a, _b;
    Connection _int_conn;

public:
    Device()
        : _int_conn(_a, _b)
    {
    }
};

现在我想定义operator=,以便Device可以相互复制:

int main()
{
    Device a, b;

    a = b;
}

当然,默认operator=是不够的,因为Connection类包含两个引用。但是对于这个特定的操作,需要Device复制所有其他属性并保持引用完整(因为它们总是指向'父'引脚)。

另一方面,用户也可以使用Connection类,然后这两个引脚可以属于任何其他类。在这种情况下,虽然复制其他属性可能是有益的,但使用operator=似乎有点不正确。换句话说:

int main()
{
    Pin a, b, c, d;
    Connection y(a, b), z(c, d);

    y = z;
}

复制非参考成员对我来说似乎不对。

此外,如果我决定更改对指针的引用,我可能也希望operator=复制它们。

我在这儿吗?什么是最好的行动方案?我想考虑定义一个额外的方法,如:

void Connection::copy_properties(Connection& rhs)

或只是在Device::operator=中复制它们。

1 个答案:

答案 0 :(得分:1)

  

[引用]应始终指向“父”引脚。

这是Connection还是Device的不变量?如果是后者,请考虑此版本的Connection

class Connection
{
    Pin* _from;
    Pin* _to;

public:
    Connection(Pin& from, Pin& to)
        : _from(&from), _to(&to)
    {}
};

也就是说,这个版本有一些更明显的复制语义。然后Device::operator=现在必须确保不要破坏Device不变量(例如,在保持_int_conn不变的情况下分配任何需要分配的内容)。实际上,_int_conn const成员可以强制执行此操作;但这只与const的{​​{1}}界面一样有用。