运算符重载被定义为函数但不用作函数

时间:2018-03-24 19:03:46

标签: c++ class object constructor operator-overloading

考虑以下C ++代码,以便我从“Sololearn”中获取它。我是初学者,如果有人能回答,我将不胜感激。它是关于运算符重载的主题。

  class MyClass {
 public:
  int var;
  MyClass() {}
  MyClass(int a)
  : var(a) { }

  MyClass operator+(MyClass &obj) {
   MyClass res;
   res.var= this->var+obj.var;
   return res; 
  }
};

当他们在主要环境中使用它时,他们使用以下代码

int main() {
  MyClass obj1(12), obj2(55);
  MyClass res = obj1+obj2;

  cout << res.var;
}

我的问题:

为什么MyClass有两个构造函数?对我来说最重要的问题是“operator +”已被定义为函数,但是当我们在main中使用它时,它的用法并不像函数。为什么?另一个不同的问题是,在这行MyClass中使用的+ res = obj1 + obj2;来自运营商+?

1 个答案:

答案 0 :(得分:2)

  

为什么MyClass有两个构造函数?

因为这就是编写它的人想要的东西。他们想要这样做,以便你可以提供一个初始值,如果你愿意,只要让它默认为零。

不幸的是,他们犯了一个错误,他们的默认构造函数被破坏了。它应该是这样的:

MyClass() : var(0) {}

...否则var的值是 indeterminate ,尝试阅读它的程序有未定义的行为

现在你可以创建一个这样的对象:

MyClass obj;      // uses first constructor

或者像这样:

MyClass obj(12);  // uses second constructor
  

&#34;操作者+&#34;已被定义为函数,但当我们在main中使用它时,它的用法不像函数。为什么呢?

因为你可以。因为运营商很特别。 C ++就是这样设计的。为了能够重载/定义它们,它们需要是函数,但要成为运算符,它们需要使用自己的语法。

请注意,可以将其称为函数,如果您想:

MyClass res = obj1.operator+(obj2);

...但你不想。

  

是否可以说在此行中使用的+ MyClass res = obj1 + obj2;来自运营商+?

a proper book学习C ++会更好。