我想保持两个实例不变,然后返回一个新实例。
目前,我正在以这种方式进行操作:

class myClass {

    public:

        myClass operator +(const myClass &obj) {

            myClass ret = *this;

            // some operation

            return ret;

        }

        // functions...

};

它有效,但是我不确定这是否正确

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

最佳答案

如果myClass在附加条件下是不可变的,则可能要使operator+为自由函数,而不是类成员。 (您可能必须使其成为一个 friend 函数。)

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

请注意,这两个操作数均由const引用使用,因此您知道您不会偶然更改它们(保持不变性)。您将返回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+的实现不需要该类的任何私有(private)成员,因此不再需要将其声明为好友函数。

09-05 13:25