C++友元関数のcin,cout,および+演算子の再ロード方法について
1818 ワード
友元関数「<>和」+」演算子を再ロードする方法*友元関数宣言形式は、friendをクラス内の関数のプロトタイプに冠する前に、この関数がクラスの友元関数となり、友元関数は宣言位置private、protectdの影響を受けません.クラス外で元の関数と定義する場合はfriend(通常の関数と同じ)を追加する必要はありません.注友元関数はクラスのメンバーではありません.小さな例を挙げると、3行3列のマトリクスmlとm 2が2つあり、2つのマトリクスの和を求める.リロード演算子「+」、「>>」、「<
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.演算子の使用方法は、メンバー関数または友元関数の再ロードにかかわらず同じです.しかし,彼らの伝達パラメータの方法が異なるため,実装コードが異なり,適用場面も異なる.
#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.演算子の使用方法は、メンバー関数または友元関数の再ロードにかかわらず同じです.しかし,彼らの伝達パラメータの方法が異なるため,実装コードが異なり,適用場面も異なる.