演算子の再ロードの詳細(4)

2241 ワード

6.リロードストリーム挿入演算子「<<>」のリロードの関数形式は、istream&operator>(istream&、カスタムクラス&);ostream&operator<(istream&、カスタムクラス&);リロード演算子"<したがって、"<>"をリロードした関数のみを友元関数として定義することはできません.メンバー関数として定義することはできません.質問:なぜ「<>」をリロードした関数は友元関数としてのみ使用できますか?カスタムクラスオブジェクトを出力するときにのみ、リロードされた演算子が使用されるため、他のタイプのオブジェクトには無効です.
例:
class Complex
{
public:
	Complex(){ real = 0, imag = 0; } //      
	Complex(double r, double i){ real = r, imag = i; }//      
	Complex operator + (Complex& c2);		//   +       
	friend ostream& operator << (ostream&, Complex&); //   <

質問:どのような場合"<例えば:cout<7.リロードストリーム挿入演算子">"C++事前定義演算子>>の役割は、cin>>iなどの入力ストリームからデータを抽出することである.入力ストリームから抽出された整数付与変数iを表す
class Complex
{
public:
	friend ostream& operator << (ostream&, Complex&); //   <> (ostream&, Complex&); //   >>       
private:
	double real;	//  
	double imag;	//  
};
ostream& operator >> (ostream& intput, Complex& c)
{
	intput >> c.real>> c.imag;
	return intput;
}
ostream& operator << (ostream& output, Complex& c)
{
	output << c.real;
	if (c.imag >= 0)  //           ,  ,     "+" 
		output << "+";
	output << c.imag;
	return output;
}//         :cout << c.real << "+" << c.imag <> c1 >> c2;   //3+6i,4-10i; cin >>          Complex     ,     <>
	cout << c1 << c2; 
	return 0;
}

演算子をリロードする具体的な方法:<1>リロードする演算子と、どのクラスに使用するかを決定します.リロード演算子は、指定したクラスに1つの演算子しか使用できません.1つの演算子で関数を再ロードすればすべてのクラスに適用できると勘違いしないでください.<2>演算子のリロードで参照(reference)を使用することの重要性.関数として参照されるパラメータを用いて、関数を呼び出す過程で値を伝達することなく虚実結合を行うことができ、アドレス方式によって形パラメータが実パラメータの別名となり、したがって、一時変数(実パラメータのコピー)は生成されず、時間と空間のオーバーヘッドが削減されます.また、リロード関数の戻り値がオブジェクトの参照である場合、戻り値は定数ではなく、参照によって表されるオブジェクトを参照し、代入番号の左側に表示されて左になり、代入されたり、coutストリームの現在の値を保持して<
8.標準型データ間の変換方式は、int i=6などの暗黙型変換と明示型変換暗黙型変換を含む.i=7.5+i; 暗黙的なタイプ変換であり、iをdoubleに変換し、13.5を加算した後、intの13明示的なタイプ変換に変換する.例えば、C++形式は:タイプ名(データ)C言語形式:(タイプ名)データC++はc言語のこのような使い方を保留し、C++が提供する方法を提唱する.