在运算符重载参数列表中包含 const 会产生错误 (C++)
Including const in operator overloading argument list gives error (C++)
我正在尝试运算符重载,为此我编写了以下代码
class OwnClass
{
private:
int x,y;
public:
OwnClass(int x, int y) { SetX(x); SetY(y); }
int GetX() { return x; }
void SetX(int x) { this->x = x;}
int GetY() { return y; }
void SetY(int y) {this->y = y;}
OwnClass& operator + (const OwnClass &o) // Problematic line
{
this->x += o.GetX();
this->y += o.GetY();
return *this;
}
};
编译时出现如下错误
fun.cpp(65): error C2662: 'OwnClass::GetX' : cannot convert 'this'
pointer from 'const OwnClass' to 'OwnClass &'
Conversion loses qualifiers
fun.cpp(66): error C2662: 'OwnClass::GetY' : cannot convert
'this' pointer from 'const OwnClass' to 'OwnClass &' Conversion loses
qualifiers
当我如下修改代码时,编译正常。
OwnClass& operator + (OwnClass &o) // removed const
{
this->x += o.GetX();
this->y += o.GetY();
return *this;
}
我无法理解为什么这样?我的意思是我无法理解编译器错误。
参数 o
声明为对 const
的引用,不能用 GetX
和 GetY
调用,因为它们是非常量成员功能。您可以(并且应该)将它们更改为 const 成员函数来解决问题。
int GetX() const { return x; }
int GetY() const { return y; }
顺便说一句:一般而言,二进制 operator+
不应该 return 对非常量的引用。最好按值 return 一个新对象。
OwnClass operator + (const OwnClass &o) const
{
OwnClass r(GetX(), GetY());
r.x += o.GetX();
r.y += o.GetY();
return r;
}
注意这种情况 operator+
也可以(并且应该)声明为 const 成员函数。正如@M.M建议的那样,使其成为非成员函数会更好。
问题是您在 const
对象上调用非常量成员函数。制作 getters const
来解决这个问题:
int GetX() const { return x; }
int GetY() const { return y; }
我正在尝试运算符重载,为此我编写了以下代码
class OwnClass
{
private:
int x,y;
public:
OwnClass(int x, int y) { SetX(x); SetY(y); }
int GetX() { return x; }
void SetX(int x) { this->x = x;}
int GetY() { return y; }
void SetY(int y) {this->y = y;}
OwnClass& operator + (const OwnClass &o) // Problematic line
{
this->x += o.GetX();
this->y += o.GetY();
return *this;
}
};
编译时出现如下错误
fun.cpp(65): error C2662: 'OwnClass::GetX' : cannot convert 'this' pointer from 'const OwnClass' to 'OwnClass &' Conversion loses qualifiers
fun.cpp(66): error C2662: 'OwnClass::GetY' : cannot convert 'this' pointer from 'const OwnClass' to 'OwnClass &' Conversion loses qualifiers
当我如下修改代码时,编译正常。
OwnClass& operator + (OwnClass &o) // removed const
{
this->x += o.GetX();
this->y += o.GetY();
return *this;
}
我无法理解为什么这样?我的意思是我无法理解编译器错误。
参数 o
声明为对 const
的引用,不能用 GetX
和 GetY
调用,因为它们是非常量成员功能。您可以(并且应该)将它们更改为 const 成员函数来解决问题。
int GetX() const { return x; }
int GetY() const { return y; }
顺便说一句:一般而言,二进制 operator+
不应该 return 对非常量的引用。最好按值 return 一个新对象。
OwnClass operator + (const OwnClass &o) const
{
OwnClass r(GetX(), GetY());
r.x += o.GetX();
r.y += o.GetY();
return r;
}
注意这种情况 operator+
也可以(并且应该)声明为 const 成员函数。正如@M.M建议的那样,使其成为非成员函数会更好。
问题是您在 const
对象上调用非常量成员函数。制作 getters const
来解决这个问题:
int GetX() const { return x; }
int GetY() const { return y; }