C++友元學習筆記
阿新 • • 發佈:2018-12-27
友元可以分為三種:
1.友元函式;
2.友元類;
3.友元成員函式;
友元的好處,通過友元函式,可以賦予函式與類成員函式相同的訪問許可權,友元函式是可以訪問類私有成員的非類成員函式。
因為友元函式不是類的成員函式,所以不能用類物件呼叫成員函式的方式(類成員符)呼叫友元函式。
友元函式的建立
template<class T> class matrix { friend ostream& operator<<(ostream& os, const matrix<T>& m) { for (int i = 0; i < m.theRows; i++) { for (int j = 0; j < m.theColumns; j++) { os << m.element[i*m.theColumns + j]<<" "; } os << endl; } os << "Output matrix finished" << endl; return os; }; friend istream& operator >> (istream& os, matrix<T>& m) { size_t number = m.theColumns * m.theRows; for (int i = 0; i < number; i++) { os >> m.element[i]; } cout << "Input fanished" << endl; return os; }; public: matrix(int theRows = 0, int theColumns = 0); matrix(const matrix<T>&); ~matrix() { delete[] element; }; int rows()const { return theRows; }; int cols()const { return theColumns; }; T& operator()(int i, int j)const; matrix<T>& operator=(const matrix<T>&); matrix<T> operator+()const; matrix<T> operator+(const matrix<T>&)const; matrix<T> operator-()const; matrix<T> operator-(const matrix<T>&)const; matrix<T> operator*(const matrix<T>&)const; matrix<T>& operator+=(const T&); void Input(); void Output(); void Transport(); private: int theRows; int theColumns; T* element; };
friend ostream& operator<<(ostream& os, const matrix<T>& m);
就是建立友元函式的方式;
函式建立了就需要定義
友元函式的定義既不需要類頭,也不要關鍵字friend;
<<是最為常用的友元函式,過載<<運算子
在平時程式設計中我們經常使用cout,這是一個ostream的物件,它是智慧的,可以識別C++的基本型別。
作為友元函式過載<<是為了達到給class 物件 輸出帶來方便;
今天在友元上掉進了坑裡,按照理論上來說,在類外定義友元函式是沒毛病的,但是我在如下定義的方式是程式編譯不成功,總是報非法使用顯式模板
在網上找了很久也沒有解決問題,在摸索中,我在類內直接定義友元函式,然後就順利運行了程式,至於其中的道理,我還需要再摸索摸索!template<class T> std::ostream& operator<< <T>(ostream& os, const matrix<T>& m) { for (int i = 0; i < m.theRows; i++) { for (int j = 0; j < m.theColumns; j++) { os << m.element[i*m.theColumns + j] << " "; } os << endl; } os << "Output matrix finished" << endl; return os; };