C++友元関数のcin,cout,および+演算子の再ロード方法について

1818 ワード

友元関数「<>和」+」演算子を再ロードする方法*友元関数宣言形式は、friendをクラス内の関数のプロトタイプに冠する前に、この関数がクラスの友元関数となり、友元関数は宣言位置private、protectdの影響を受けません.クラス外で元の関数と定義する場合はfriend(通常の関数と同じ)を追加する必要はありません.注友元関数はクラスのメンバーではありません.小さな例を挙げると、3行3列のマトリクスmlとm 2が2つあり、2つのマトリクスの和を求める.リロード演算子「+」、「>>」、「<
#include "pch.h"
#include 
using namespace std;

class Matrix    //       
{
public:
	Matrix() {};     //    
	~Matrix() {};   //    
	friend istream & operator >>(istream & in, Matrix &m);  //     ">>"
	friend ostream & operator <>(istream & in, Matrix &m)
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			in >> m.a[i][j];
		}
	}
	return in;
}
ostream & operator <> m1;
	cout << "       :" << endl;
	cin >> m2;
	m = m1 + m2;
	cout << "        :" << endl;
	cout << m << endl;
}


1.friend ostream & operator <>P;コンパイラはoperator>(cin,P);参照パラメータinはcinの別名となる.関数はistreamへの参照を返し、演算子の呼び出しを続行します.2.friend ostream & operator >>(ostream & out, Matrix &m); の&はすべてリファレンス伝達を表します.戻り値はリファレンスによって渡され、パラメータもリファレンスによって渡されます.cinの戻り値はistreamタイプのインデックス3である.メンバー関数には、オブジェクト呼び出しが必要です.最初のパラメータはクラスのオブジェクトでなければなりませんが、<>最初のパラメータはストリームのオブジェクト参照です.したがって、メンバー関数は使用できません.4.友元関数を使って、thisポインタがなくて、2つのパラメータが必要で、左右の操作数はすべてパラメータを通じて伝達します.5.メンバー関数の左オペランドを使用して、オブジェクトからthisポインタを介して右オペランドをパラメータで渡します.6.両目演算子は一般的に友元関数とメンバー関数で再ロードできますが、友元関数のみで再ロードできる場合があります.すなわち、両目演算子の左側の変数はオブジェクトではなく定数です!!!関数operator<>は、Matrixクラスの友元として宣言されます.Matrixクラスオブジェクトを演算子の右演算子として使用するため、関数を呼び出すのは、Matrixクラスのオブジェクトではなくストリームオブジェクトcinまたはcoutであるため、これら2つの演算子リロード関数は非メンバー関数である必要があります.7.演算子の使用方法は、メンバー関数または友元関数の再ロードにかかわらず同じです.しかし,彼らの伝達パラメータの方法が異なるため,実装コードが異なり,適用場面も異なる.