3

我有一个名为 Coord 的类...它有实例数据 x,y。我想覆盖 * 运算符,以便 * 运算符可用于将 Coord 乘以整数或双倍!这是我提出的解决方案:

Coord& Coord::operator*(int n)
{
    this->x = this->x*n;
    this->y = this->y*n;
    return *this;
}

它有效 - 我已经从 main 测试了一些打印输出......唯一的问题是......我从 -Weffc++ 标志收到警告!它说我的函数应该按值返回!我知道这个标志对应于“Effective C++”一书,但我手头没有副本——这本书有什么建议?什么是按值传递?

4

3 回答 3

6

只是为了详细说明灰熊的评论......这不是就地乘法。因此,您应该将其声明为 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);
}

就地乘法是不同的(和非常量):

Coord& Coord::operator*=(int n) {
    x *= n;
    y *= n;
    return *this;
}
于 2012-09-10T23:26:32.120 回答
1

一般来说,这类事情分两部分完成,成员operator*=和非成员operator*使用*=

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;
}
于 2012-09-11T10:13:16.857 回答
1

您尚未实现operator*,而是实现了 self-mutating operator*=,将结果分配回原始对象。

考虑以下int示例的运营商实施的影响:

int x = 5;
int y = 2;
int z = x * y;

现在,通过与您的代码类似地实现整数乘法,您最终会得到两者y z等于 10。

为了实现普通operator*类型运算符,您需要创建一个临时对象并按值返回它。

您可能正在寻找更像这样的实现(假设您的类有两个参数构造函数):

Coord Coord::operator*(int n) const
{
    return Coord(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);
}
于 2012-09-11T02:45:13.090 回答