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相关代码时会这样做。
答案 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 并避免成本成员。