C++ 覆盖+;/-/*/%按整数和-Weffc++;旗帜
我有一个叫做Coord的类…它有实例数据x,y。我想重写*运算符,这样*运算符就可以用来将坐标乘以整数或双精度!这就是我提出的解决方案:C++ 覆盖+;/-/*/%按整数和-Weffc++;旗帜,c++,warnings,C++,Warnings,我有一个叫做Coord的类…它有实例数据x,y。我想重写*运算符,这样*运算符就可以用来将坐标乘以整数或双精度!这就是我提出的解决方案: Coord& Coord::operator*(int n) { this->x = this->x*n; this->y = this->y*n; return *this; } 它可以工作-我已经测试了一些来自main的打印输出…唯一的问题是…我从-Weffc++标志得到一个警告!它说我的函数应该按
Coord& Coord::operator*(int n)
{
this->x = this->x*n;
this->y = this->y*n;
return *this;
}
它可以工作-我已经测试了一些来自main的打印输出…唯一的问题是…我从-Weffc++标志得到一个警告!它说我的函数应该按值返回!我知道这个标志对应于“有效的C++”这本书,但我手头没有一本——这本书有什么建议?什么是按价值传递的?仅详细说明格里兹的评论。。。这不是就地乘法。因此,您应该声明它为const,以明确防止:
Coord Coord::operator*(int n) const {
Coord c(*this);
c.x *= n;
c.y *= n;
return c;
}
或者,如果您有一个有用的构造函数:
Coord Coord::operator*(int n) const {
return Coord(x*n, y*n);
}
就地乘法不同(且非常量):
您没有实现
操作符*
,而是实现了自变异操作符*=
,将结果分配回原始对象
考虑操作员实施以下int
示例的影响:
int x = 5;
int y = 2;
int z = x * y;
现在,使用与代码类似的整数乘法,您将得到y
和z
都等于10的结果
为了实现普通的操作符*
类型操作符,您需要创建一个临时对象并按值返回该对象
您可能正在寻找更像这样的实现(假设您的类有一个双参数构造函数):
但请注意,通常情况下,运算符的明显含义并不清楚,重载只会导致混淆。考虑一个非成员命名函数(使用命名成员缩放函数),沿着这些行:
Coord& Coord::ScaleBy(int n)
{
this->x = this->x*n;
this->y = this->y*n;
return *this;
}
Coord ScaleCoord(Coord c, int n)
{
return c.ScaleBy(n);
}
通常,这类操作分为两部分,一部分是成员
操作符*=
,另一部分是使用*=
的非成员操作符*
:
Coord& Coord::operator*=(int n) {
x *= n;
y *= n;
return *this;
}
Coord operator*(const Coord& c, int n) {
Coord res(c);
res *= n;
return res;
}
它告诉您的问题是,
操作符*
应该返回一个新创建的对象,而不是修改现有对象(这毕竟是*=
的意思)。在这种情况下,您将返回对局部变量的引用,这显然是错误的。如果重载运算符,请使其行为与运算符通常的行为相同。Scott Meyers还建议返回const-Coord
,因此不能(a*b)=c
@chris:不幸的是,该建议已经过时,因为它禁用了移动。@chris:鉴于C++11和移动构造函数/赋值,该建议应该被弃用。@chris:考虑到一些编码建议:this->
s是不必要的,而且会分散注意力。更清楚:x*=n;y*=n代码>。而且,由于它修改了*这个
,所以这个函数的名称实际上应该是*=
。
Coord& Coord::ScaleBy(int n)
{
this->x = this->x*n;
this->y = this->y*n;
return *this;
}
Coord ScaleCoord(Coord c, int n)
{
return c.ScaleBy(n);
}
Coord& Coord::operator*=(int n) {
x *= n;
y *= n;
return *this;
}
Coord operator*(const Coord& c, int n) {
Coord res(c);
res *= n;
return res;
}