1

我正在读一本 C++ 书(我以前用 C 编程过),它被称为 C++ Primer 5th edition。我在一篇包含所有 stackoverflow 推荐书籍的帖子中找到了它。当我们开始学习课程时,它会显示如下(不完全是):

Class1 c1, c2;
cin >> c1 >> c2;
if(c1.getName() == c2.getName()){
    cout << c1 + c2 << endl;
}

这有意义吗?课程中的内容无关紧要我只想知道是否有任何课程可以做到这一点,如果有的话,你能给我举个例子吗?想象一下如果每个类都有一个名字和一个数字(string getName(), int getNumber()),当你使用cin时会发生什么?当你使用 c1 的 cout 时?c1+c2 是什么意思?谢谢,我希望你能帮助我!

编辑:哦,顺便说一句,在 Java 中我们使用 c1.getName().equals(c2.getName()) 来比较字符串,在 C++ 中需要吗?

4

2 回答 2

3

您要问的只是运算符重载。c1 and c2是 的对象Class1。这里Extraction operator(>>) and + operator已经超载了。

看一下这个:-

C++ 中的运算符重载

类重载 >> 和 << 运算符的示例:-

#include <iostream>
using namespace std;

class Distance
{
   private:
      int feet;             // 0 to infinite
      int inches;           // 0 to 12
   public:
      // required constructors
      Distance(){
         feet = 0;
         inches = 0;
      }
      Distance(int f, int i){
         feet = f;
         inches = i;
      }
      friend ostream &operator<<( ostream &output, 
                                       const Distance &D )
      { 
         output << "F : " << D.feet << " I : " << D.inches;
         return output;            
      }

      friend istream &operator>>( istream  &input, Distance &D )
      { 
         input >> D.feet >> D.inches;
         return input;            
      }
};
int main()
{
   Distance D1(11, 10), D2(5, 11), D3;

   cout << "Enter the value of object : " << endl;
   cin >> D3;
   cout << "First Distance : " << D1 << endl;
   cout << "Second Distance :" << D2 << endl;
   cout << "Third Distance :" << D3 << endl;


   return 0;
}

来源:- http://www.tutorialspoint.com/cplusplus/input_output_operators_overloading.htm

于 2013-06-28T09:21:55.630 回答
1

这有意义吗?

它可能。

课程中的内容无关紧要我只想知道是否有任何课程可以做到这一点,如果有的话,你能给我举个例子吗?想象一下如果每个类都有一个名字和一个数字(string getName(), int getNumber()),当你使用cin时会发生什么?

代码假定>>定义为获取字段的值,例如可以使用...

std::istream& operator>>(std::istream&, Class1& x)
{
    return is >> x.name_ >> x.number_;
}

可悲的是,代码不检查转换是否成功(即输入可以按希望解析为字符串和数字。更好的代码是:

Class1 c1, c2;
if (cin >> c1 >> c2)
    if(c1.getName() == c2.getName())
        cout << c1 + c2 << endl;

假设您输入“hello 20 goodbye 30”-> 您最终将c1's 字段分别设置为“hello”和 20,并且明显c2设置为“goodbye”和 30。

当你使用 c1 的 cout 时?

如果您使用 stream c1,则输出由您创建的运算符确定。一个简单的实现是:

std::ostream& operator<<(std::ostream& os, const Class1& c)
{
    return os << c.name_ << ' ' << c.number_;
}

c1+c2 是什么意思?谢谢,我希望你能帮助我!

这意味着匹配函数告诉它的任何含义,例如 - 您可能喜欢:

Class1 operator+(const Class1& lhs, const Class1& rhs)
{
    return Class1(lhs.name_ + rhs.name_, lhs.number_ + rhs.number_);
}

或者,您可能想要连接数字,以便number_7 和 23 组成 723……在您的程序上下文中任何有意义的东西。

编辑:哦,顺便说一句,在 Java 中我们使用 c1.getName().equals(c2.getName()) 来比较字符串,在 C++ 中需要吗?

通常我们创建一个比较函数,以便我们可以使用==

bool operator==(const Class1& lhs, const Class1& rhs)
{
    return lhs.name_ == rhs.name_ && lhs.number_ == rhs.number_;
}

当然,你可以做一些事情,比如忽略大小写差异,认为“Anthony”和“Tony”是等价的等等。

于 2013-06-28T09:28:41.350 回答