如何正确地重载结构的'+'运算符

时间:2013-03-05 23:22:27

标签: c++ operator-overloading

我想为A struct重载'+'运算符,但我收到编译器警告 这是我的尝试:

struct wektor{
    int x;
    int y=0;    
    int norm(){
        return x*x+y*y;
    }
};

wektor& operator +(wektor &a,wektor &b){
    wektor c;
    c.x=a.x+b.x;  // 12 line - warning here
    c.y=a.y+b.y;
    return c;
};

编译器警告:

  

[警告]非静态数据成员初始化程序仅适用于-std = c ++ 11或-std = gnu ++ 11 [默认启用] 12行

4 个答案:

答案 0 :(得分:8)

警告告诉你这条线:

int y=0;

在C ++ 11之前,您不能在非静态非const成员上使用初始化器。如果要将y初始化为0,则必须为wektor提供带有成员初始化列表的构造函数。

尽管如此,您的operator+参数应为const wektor&类型。它也应该按值返回,因为此时您正在返回对在函数末尾将被销毁的本地对象的引用,这很糟糕。它应该是这样的:

wektor operator +(const wektor &a, const wektor &b){
    wektor c;
    c.x=a.x+b.x;  // 12 line - warning here
    c.y=a.y+b.y;
    return c;
};

答案 1 :(得分:4)

首先,二元运算符+应该返回一个新值,而不是一个引用。如果以引用的形式实现为输入,则这些应该是const:

wektor operator +(const wektor &a, const wektor &b);

其次,警告是关于这个初始化:

struct wektor{
    int x;
    int y=0;    // HERE! C++11 only
    int norm(){
        return x*x+y*y;
    }
};

您只能在C ++ 11中执行此操作。您可以在C ++ 03中使用构造函数。

struct wektor{
    wector() : y() {} // zero-initializes y
    int x;
    int y;
    int norm(){ return x*x+y*y;}
};

回到operator+,我会实现一个成员operator+=,然后在非成员operator+中使用它:

wektor operator +(wektor a, const wektor &b)
{
  return a+= b;
}

或者,为wectorx提供y两个参数构造函数:

wector(int x, int y) : x(x), y(y) {}
然后

蚂蚁

wektor operator + (const wektor& a, const wektor &b)
{
  return wector(a.x + b.x, a.y + b.y);
}

答案 2 :(得分:2)

不是那样的。签名应该是

wektor operator +(const wektor &a, const wektor &b)

即。不要通过+运算符的引用返回,更重要的是,不要通过引用返回临时值。

答案 3 :(得分:1)

这是一个警告,你正在使用C ++ 11中的一个功能,这在以前的C ++标准中是不可用的。

当你知道你编程的内容按你的思维方式工作时,你可以 通过这样做来摆脱这个错误:

如果你正在使用CodeBlocks:

  1. 右键单击“构建选项...”
  2. 选择“其他选项”标签
  3. 添加“-std = gnu ++ 11”
  4. 如果您正在使用命令行: 将“-std = gnu ++ 11”添加到命令arg's。