C++入出力オペレータの負荷の深さ分析


オペレータのリロードには、いくつかの規則があります。1.リロードオペレータは、クラスまたはエニュメレート・タイプの操作数を備えていなければなりません。この規則では、オペレータを強制的にリロードすることは、内蔵型のオブジェクトに対するオペレータの意味を再定義することができません。例えば:int operator+(int,int)は、いけません。    2.クラスのためにオペレータをリロードする場合は、オペレータをクラスメンバーに設定するか、それとも普通の非メンバー関数に設定するかを選択しなければなりません。プログラムが選択されていない場合があります。オペレータはメンバーでなければなりません。他の状況では、いくつかの経験が私たちの決定を導くことができます。以下はいくつかの指導です。a.賦値(=)、下付き([])、呼び出し()、およびメンバーアクセス矢印(->)などのオペレータはメンバーとして定義しなければなりません。これらのオペレータを非メンバ関数として定義してコンパイルするときにエラーとしてマークします。b.値付けのように、複合割当オペレータは通常クラスのメンバーとして定義されるべきである。賦値と違って、必ずしもそうしなければならないとは限らないが、非メンバ複合賦値オペレータと定義されていれば、コンパイルエラーは発生しない。c.オブジェクトの状態を変更するか、または与えられたタイプと密接に関連する他のいくつかのオペレータは、自己増加のように、自己減少和解引用として一般的にクラスメンバーとして定義されるべきである。d対称のオペレータ、例えば算術演算子、等しいオペレータ、関係オペレータとビット操作子は、通常の非メンバ関数として定義したほうがいい。e io操作子は、非メンバー関数として定義され、クラスの友達として重載されなければなりません。

// OverloadCinCout.cpp : 。
//
#include "stdafx.h"
#include "iostream"
#include "string"
using namespace std;
class Fruit
{
public:
 Fruit(const string &nst = "apple", const string &cst = "green"):name(nst),colour(cst){}
 ~Fruit(){}
 friend ostream& operator << (ostream& os, const Fruit& f);  // , ,
 friend istream& operator >> (istream& is, Fruit& f);       //
private:
    string name;
 string colour;
};
ostream& operator << (ostream& os, const Fruit& f)
{
 os << "The name is " << f.name << ". The colour is " << f.colour << endl;
 return os;
}
istream& operator >> (istream& is, Fruit& f)
{
 is >> f.name >> f.colour;
 if (!is)
 {
  cerr << "Wrong input!" << endl;
 }
 return is;
}
int _tmain(int argc, _TCHAR* argv[])
{
 Fruit apple;
 cout << "Input the name and colour of a kind of fruit." << endl;
 cin >> apple;     
 cout << apple;
 return 0;
}