使用Const成员在类中进行C ++运算符重载?

时间:2016-07-31 16:49:18

标签: c++ const overloading operator-keyword

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相关代码时会这样做。

1 个答案:

答案 0 :(得分:1)

问题在于:

SomeClass newClass;
newClass = someClass + 3;

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

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

使用第二条指令,您尝试将运算符+ 构造的新对象分配给对象。

所以实际上你正试图修改具有 const 变量成员的对象本身。

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

newClass = someClass + 3;

表示“复制左侧对象中=的右侧对象中的所有变量符号”

在这种情况下,变量 someConst 被声明为常量值,因此您无法覆盖其值。实际上,该操作会产生编译错误。

解决方案

为了处理这个“问题”,你需要编写一个自定义赋值运算符

这就是一个例子:

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 并避免成本成员。