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