【问题标题】:Why does + operator overloading return type is class type not integer?为什么+运算符重载返回类型是类类型而不是整数?
【发布时间】:2012-09-28 00:28:52
【问题描述】:

本文作者选择返回类型为类类型http://www.learncpp.com/cpp-tutorial/92-overloading-the-arithmetic-operators/强调文本,我们可以将返回类型改为返回int,因为我想做以下,我试过这个和它工作得很好,为什么作者做了返回类型类??

#include <cstdlib>
#include <iostream>
using namespace std;
class Cents // defining new class
{
    private:
    int m_Cents;
    int m_Cents2;
    public:
    Cents(int Cents=0, int Cents2=0) // default constructor
    { 
        m_Cents=Cents;
        m_Cents2=Cents2;
}
Cents(const Cents &c1) {m_Cents = c1.m_Cents;}
friend ostream& operator<<(ostream &out, Cents &c1); //Overloading << operator
friend int operator+(const Cents &c1, const Cents &c2); //Overloading + operator
};
ostream& operator<<(ostream &out, Cents &c1)
{
out << "(" << c1.m_Cents << " , " << c1.m_Cents2 << ")" << endl;
return out; 
}
int operator+(const Cents &c1, const Cents &c2)
{
return ((c1.m_Cents + c2.m_Cents) + (c1.m_Cents2 + c2.m_Cents2 ));
}
int main(int argc, char *argv[])
{
Cents cCents(5, 6);
Cents bCents;
bCents = cCents;
cout << bCents << endl;
Cents gCents(cCents + bCents, 3);
cout << gCents << endl;
system ("PAUSE");
return 0;
}

【问题讨论】:

  • 当你重载像+这样的运算符时,它应该返回与参数相同的类型!
  • 好的,但是这条线呢:Cents gCents(cCents + bCents, 3);如何将两个值传递给构造函数
  • 如果你加了苹果,你会退回橘子吗?那么为什么要在添加 Cents 时返回 int 呢?
  • 因为我想要这条线 Cents gCents(cCents + bCents, 3);所以我可以传递加两美分的总和并将其与另一个数字一起使用以将其传递给构造函数
  • 好吧,C++ 对你来说真的没有意义,除非你更彻底地阅读这本书,否则所有其他的东西都会看起来完全没有意义,你真的不应该发布所有的东西对SO来说看起来很荒谬。由于这个原因(即没有研究工作),我不得不对此投反对票。

标签: c++ operator-overloading


【解决方案1】:

除了许多其他事情之外,要记住的一件事是,在两个相同类型的对象之间进行相加的结果总是属于那个非常特定的类型。所以它可能对你有用,但在逻辑上它是不正确的。 其次,您无法在不返回类类型的情况下执行嵌套的+ 语句。 例如,如果您想这样做。

Obj1 + Obj2 + Obj3 ;

你会得到一个编译时错误。 原因是+ 运算符的重载函数应该按相同类类型的值返回结果。下面写的操作符也可以写成函数调用如下。

Obj1 + Obj2 ;

相当于...

Obj1.operator+(Obj2) ;

对于嵌套加法操作,你这样做。

Obj1 + Obj2 + Obj3 ;

相当于....

(Obj1.operator+(Obj2)).operator+(Obj3) ;
|---------------------|                       

这里,这部分……

(Obj1.operator+(Obj2))

成为另一个临时类对象,在其上调用下一个方法,Obj3 作为参数。因此,如果您不从 + 函数返回类对象,这部分将是 int 而不是对象。 + 函数不会在该 int 或任何其他非类数据类型上调用。所以它会给你一个错误。

简而言之,建议始终按值从重载的+ 函数返回对象。

【讨论】:

  • 谢谢这很有帮助,我问这个是因为我的构造函数是:Cents(int Cents=0, int Cents2=0) // 默认构造函数 { m_Cents=Cents; m_Cents2=Cents2;所以我必须传递两个整数(添加两个类和另一个数字的总和)所以这就是我更改返回类型的原因
  • 是的。如果您不认真,您可能会更改返回类型。但是这种情况总是可以通过一些优化来避免的。
  • 现在我知道答案了,我不认为我可以创建一个新的构造函数来接受一个类和一个整数
【解决方案2】:

一般来说,加法的语义是,当您添加两个给定类型的对象时,您希望得到的对象具有相同的类型。

你没有理由不能做你想做的事,但这是非标准加法语义的一个例子。

【讨论】:

  • 我的构造函数如下: Cents(int Cents=0, int Cents2=0) // 默认构造函数 { m_Cents=Cents; m_Cents2=Cents2;所以我想传递两个整数(类的总和和另一个数字)所以我需要更改返回类型来这样做
  • 好吧,没有什么可以阻止您创建一个也引用 Cents 对象的构造函数(除了您已经拥有的构造函数)。这将有助于以美分形式保存所有内容并为您提供类型一致性。
  • 非常感谢你,我认为这不可能发生,对不起,也许我在问愚蠢的问题,但我还在学习
猜你喜欢
  • 1970-01-01
  • 2017-06-07
  • 2013-11-21
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 2017-03-01
相关资源
最近更新 更多