返回不可变的新实例的正确方法是什么?

时间:2016-01-15 15:24:48

标签: c++ immutability

我想保持两个实例不变,然后返回一个新实例。 目前我这样做:

class myClass {

    public:

        myClass operator +(const myClass &obj) {

            myClass ret = *this;

            // some operation

            return ret;

        }

        // functions...

};

它有效,但我不确定,如果这是正确的方式

修改

operator +只是一个例子。我只是好奇,如何用C ++编写不可变的函数/方法

1 个答案:

答案 0 :(得分:1)

如果myClass在添加时应该是不可变的,您可能希望使operator+成为自由函数而不是类成员。 (你可能必须把它变成朋友的功能。)

myClass operator+(const myClass &lhs, const myClass &rhs) {
  return myClass( /* some operation */ );
}

请注意,两个操作数都是由const引用获取的,因此您知道不能意外地更改它们(保持immutability属性)。您正在返回myClass的新实例,该实例现在是不可变的。您只需一步构造并返回结果,因为如果myClass确实是不可变的,您可能无法默认构造一个然后设置其值。

这是一个愚蠢的例子:

class myClass {
  public:
    explicit myClass(int x) : m_x(x) {}
    friend myClass operator+(const myClass &lhs, const myClass &rhs);
  private:
    int m_x;
};

myClass operator+(const myClass &lhs, const myClass &rhs) {
  return myClass(lhs.m_x + rhs.m_x);
}

如果你真的想把它作为一个类方法实现,那么该方法应该标记为const,以确保实现不会意外地改变左手实例。

二进制算术运算符(如operator+)通常根据算术自赋值运算符(如operator+=)来定义,它们显然不是不可变的。如果我们将此方法添加到myClass

myClass &operator+=(const myClass &rhs) {
  m_x += rhs.m_x;
  return *this;
}

然后定义operator+的常用习语是:

myClass operator+(const myClass &lhs, const myClass &rhs) {
  myClass result = lhs;
  result += rhs;
  return result;
}

现在operator+的实现不需要该类的任何私有成员,因此不再需要将其声明为友元函数。

相关问题