1. 程式人生 > >C++友元學習筆記

C++友元學習筆記

友元可以分為三種:

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;
};
在網上找了很久也沒有解決問題,在摸索中,我在類內直接定義友元函式,然後就順利運行了程式,至於其中的道理,我還需要再摸索摸索!