运算符重载类的定义 - C ++

时间:2016-03-07 03:20:27

标签: c++ class overloading

对不起,这是一个简单的问题。我一直在使用tutorialspoint.com来学习C ++。目前我正在尝试学习类和运算符重载。对于其他成员函数,网站使用此约定

    class Box {
     private:
      int Volume;
     public:
      Box(int num);
      ...
     }
     Box::Box(int num) {
      Volume = num;
     }

然而,当重载运算符时,他们使用此

     class Box {
      private:
       int volume;
      public:
       Box(int num);
       Box operator+(const Box &b) {
        Box box;
        box.volume = this->volume + b.volume;
        return box;
       }
      }

他们定义了类中的重载函数。可以在课外定义它吗?如果是这样,怎么样?我试过了

     Box Box::operator+(const Box &b) {...}
     Box::Box operator+(const Box &b) {...}

但这些不起作用

如何在课外进行此操作?

再次,对不起,这是一个简单的问题。 感谢

修改 我的代码看起来像这样

#include <iostream>
#include <string>
using namespace std;

class Box {
 private:
  int volume;
 public:
  Box(int num);
  Box operator+(const Box &b);
};

Box::Box(int num) {
 volume = num;
}

Box Box::operator+(const Box &b) {
 Box box;
 box.volume = this->volume + b.volume;
 return box;
}

int main() {
 Box one(2);
 Box two;
 two = one + one;  
}

我的错误是

    Overloading.cc: In member function 'Box Box::operator+(const Box&)':
    Overloading.cc:18:6: error: no matching function for call to 'Box::Box()'
    Overloading.cc:18:6: note: candidates are:
    Overloading.cc:13:1: note: Box::Box(int)
    Overloading.cc:13:1: note:   candidate expects 1 argument, 0 provided
    Overloading.cc:5:7: note: Box::Box(const Box&)
    Overloading.cc:5:7: note:   candidate expects 1 argument, 0 provided
    Overloading.cc: In function 'int main()':
    Overloading.cc:25:6: error: no matching function for call to 'Box::Box()'
    Overloading.cc:25:6: note: candidates are:
    Overloading.cc:13:1: note: Box::Box(int)
    Overloading.cc:13:1: note:   candidate expects 1 argument, 0 provided
    Overloading.cc:5:7: note: Box::Box(const Box&)
    Overloading.cc:5:7: note:   candidate expects 1 argument, 0 provided

2 个答案:

答案 0 :(得分:3)

是的,尽可能在类外定义运算符是可能的,也是常见的。 你想要这个:

Box operator+( const Box& left, const Box& right ) { ... }

修改

如果您的意思是要将运算符声明为成员函数并在其他地方(在cpp中)定义它,那么它是:

ħ

class Box
{
    Box operator+( const Box& other ) const;
};

CPP

Box Box::operator+( const Box& other ) const { ... }

编辑2: 现在您已经发布了错误消息。您在创建Box two;时尝试使用默认构造函数但是,由于您创建了非默认构造函数Box( int ),因此编译器不会为您生成默认构造函数。

答案 1 :(得分:1)

错误消息与运算符重载无关,只是抱怨Box没有语句Box::Box()和{{Box box;的默认构造函数(即Box two;) 1}}。

您可以为其添加默认构造函数,例如:

class Box {
 private:
  int volume;
 public:
  Box() : volume(0) {}
  ~~~~~~~~~~~~~~~~~~~~
  Box(int num);
  Box operator+(const Box &b);
};

或更改语句以指定参数,例如:

Box box(0);