使用 Const 成员在 Class 中重载 C++ 运算符?

C++ Operator Overloading in Class with Const Members?

class SomeClass {
    int someNum;
    const int someConst;
    public:
        SomeClass() : someNum(12), someConst(15)
        {
        }
        SomeClass operator+(int num) {
            SomeClass newSomeClass;
            newSomeClass.someNum += num;
            return newSomeClass;
        }
};

int main() {
    SomeClass someClass;
    SomeClass newClass;
    newClass = someClass + 3;
}

我不明白为什么上面的代码没有编译,但是当删除了与 const 相关的代码后,我就编译了。

问题出在这里:

SomeClass newClass;
newClass = someClass + 3;

使用第一条指令创建对象 newClass 并初始化成员变量:

[...] someNum(12), someConst(15) [...]

在第二条指令中,您尝试将由 operator+ 构造的新对象分配给对象。

所以实际上你正试图修改对象本身,它有一个const变量成员。

C++ 提供默认的赋值运算符:

newClass = someClass + 3;

表示"copy all variable mambers in the object on the right side of the = in the object in the left side".

在这种情况下,变量 someConst 被声明为常量值,因此您不能覆盖它的值。确实运行编译错误。

解决方案

为了处理这个 "problem" 你需要写一个 自定义赋值运算符 .

这是一个例子:

class SomeClass {
int someNum;
const int someConst;
public:
    SomeClass() : someNum(12), someConst(15)
    {
    }
    SomeClass operator+(int num) {
        SomeClass newSomeClass;
        newSomeClass.someNum += num;
        return newSomeClass;
    }

   // Custom assignment operator
   SomeClass& operator=(const SomeClass& oth) {
     if (this != &oth) {
       this->someNum = oth.someNum;
     }
     return *this;
   }
};

通过这种方式,您告诉我们只从对象复制成员变量 someNum 并避免成本成员。