C++ 覆盖+;/-/*/%按整数和-Weffc++;旗帜

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的类…它有实例数据x,y。我想重写*运算符,这样*运算符就可以用来将坐标乘以整数或双精度!这就是我提出的解决方案:

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;
}