运算符重载定义在C++之外

Operator overloading definition outside of the C++

本文关键字:C++ 之外 定义 重载 运算符      更新时间:2023-10-16

对不起,这是一个如此简单的问题。我一直在使用 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

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

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

编辑:

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

h

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

.cpp

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

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

错误消息与

运算符重载无关,它只是抱怨Box没有默认构造器(即 Box::Box() ) 为语句 Box box;Box two;

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

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

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

Box box(0);