【问题标题】:Operator-overloading is defined as a function but not used as a function运算符重载被定义为函数但不用作函数
【发布时间】:2018-03-24 19:03:45
【问题描述】:

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

  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; 中使用的 + 是真的吗?来自 Operator+?

【问题讨论】:

  • 您可以拥有任意数量的构造函数,但是构造类的实例是有意义的。是的,这是重载 + 运算符的语法,不确定您还想听什么。是的,在您的示例中,MyClass::operator+ 是从 obj1+obj2 调用的。
  • MyClass res = obj1+obj2; 与MyClass res = obj1.operator+(obj2); 相同,重载运算符只是添加了“预期”语法的函数。 operator+ 是函数的名称。
  • MyClass() {} 你好未定义的行为。不要像那些孩子那样写代码!
  • 每个问题一个问题,而不是三个。
  • @CoryKramer:你为什么要在 cmets 部分回答?

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


【解决方案1】:

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

因为这就是写它的人想要的。他们希望这样做,以便您可以根据需要提供初始值,否则就让它默认为零。

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

MyClass() : var(0) {}

...否则var 的值是indeterminate,并且试图读取它的程序具有未定义的行为。

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

MyClass obj;      // uses first constructor

或者像这样:

MyClass obj(12);  // uses second constructor

"operator+" 已经被定义为一个函数,但是当我们在 main 中使用它时,它的用法并不像一个函数。为什么?

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

请注意,如果您愿意,可以像函数一样调用它:

MyClass res = obj1.operator+(obj2);

……但你不想这样做。


这行MyClass res = obj1+obj2; 中使用的+是真的吗?来自 Operator+?

是的。


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

【讨论】:

  • 非常感谢您的回答。我们可以返回另一个东西而不是 res 吗?当然,我知道数据类型是 MyClass。
  • @Baghban:只要是MyClass,你可以返回任何你喜欢的东西。尽管人们对操作符函数的行为方式有一定的期望,并且不喜欢对他们做出奇怪的事情感到惊讶。所以尽量不要偏离你目前正在做的事情太远。
  • 我删除了第一个构造函数MyClass(): var(0) {},出现错误。为什么?
  • @Baghban:因为现在MyClass res;这个语句已经没法工作了。
  • (MyClass res(this-&gt;var+obj.var); 可能会更好)
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
相关资源
最近更新 更多