1

私はC++の本を読んでいます(以前にCでプログラミングしたことがあります)、それはC++ Primer 5th editionと呼ばれています。すべてのスタックオーバーフローの推奨本を掲載した投稿で見つけました。クラスの学習を開始すると、次のように表示されます (正確ではありません)。

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のフィールドがそれぞれ「hello」と 20 にc2設定され、明らかに「さようなら」と 30 に設定されます。

そして、c1のcoutを使用するときは?

をストリーミングする場合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 に答える