C++入出力オペレータの負荷の深さ分析
2107 ワード
オペレータのリロードには、いくつかの規則があります。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;
}