cppTest-6.3:友元函數&友元類

/**
 * cppTest-6.3:友元函數&友元類
 *
 * 友元總結:
 * 1、可以定義爲友元的有類、類中的函數:
 * 		友元類聲明格式:在另一個類中:friend 類名。
 * 		單向友元函數聲明格式:在另一個類中:friend 返回值類型 本類名::函數名(形參表)。不能在本類或另一個類中實現此函數代碼!只能在類外實現函數,且要指明所屬類。
 * 		雙向友元函數聲明格式:在兩個類中:friend 普通成員函數聲明格式。不能在類中實現此函數代碼,因爲要保持代碼一致!
 * 	2、友元的權限:
 * 		若類A是類B的友元(即在B中聲明瞭friend A),那麼A可以訪問B的所有成員,反過來卻不行!
 * 		友元函數的情況一樣。
 * 	3、友元的特性:
 * 		不具有交換性和傳遞性。交換性如2 。傳遞性:A是B的友元,B是C的友元,A卻不是C的友元!
 * 	總結:
 * 		1)可以形象地比喻:我把你當做朋友,那我會把我所有的東西告訴你,但是你不用告訴我,除非你也把我當做朋友;
 * 		2)我的朋友的朋友,不是我的朋友。
 * author 煒sama
 */
#include<iostream.h>

class line;//@@在C++中,對一類的向前引用起作用的唯一時刻就是當涉及到友元函數時

class box{
	int i;
public:
	box(int I){i=I;}
	~box(){}
	void showI(){cout<<i<<endl;};
	friend int sameI(line l,box b);//雙向友元函數showI既不是box成員又不是line的成員,聲明和實現時都不能帶上【類::】!
	void add();
	void add(line l);//對象傳值不能達到修改原對象裏成員的目的!與Java不一樣!
	//void add(line &l);//雖然形參與上面的不一樣,但是賦值方式一樣!所以這兩個函數某些情況下無法共存:
	//如果不調用這兩個中的任何一個函數,編譯時沒錯;否則不能通過編譯!

	void add2(line &l);//對象的引用傳值才能達到修改對象裏成員的目的!
	void showLine();//訪問line類中的成員
	void showLine(line &l);//通過引用方式訪問line類中的成員
};

class line{
	int i;
public:
	line(int I){i=I;}
	~line(){}
	void showI(){cout<<i<<endl;};
	friend int sameI(line l,box b);//同上
	friend void box:: add();//單向友元函數add是box成員而不是line的成員,聲明和實現時都要帶上【類名::】!這些函數都對應着上面box類裏的函數。
	friend void box:: add(line l);//同上
	friend void box:: add2(line &l);//同上
	friend box;//友元類
};
int sameI(line l,box b)//前面不用帶任何 類:: 修飾符,因爲友元函數既非line的成員,也非box的成員,但卻是line和box的友元函數
{
	if(l.i==b.i)return 1;
	return 0;
}
void box::add(){
	i++;//這種沒有指明訪問哪個對象的成員的友元函數最終訪問的只是自己對象的成員!
}
void box::add(line l){
	i++;
	l.i++;
}
void box::add2(line &l){
	i++;
	l.i++;
}
void box::showLine(){
	line l(100);
	cout<<l.i<<endl;
}
void box::showLine(line &l){
	cout<<l.i<<endl;
	l.i++;
	cout<<l.i<<endl;
}

void main()
{
	//單向友元函數只能給本類以調用成員函數的方式調用,另一個類不能調用友元函數!雙向友元函數調用時不能指明類名。詳情看下面代碼:
	box b(10);
	line l(2);
	b.showI();
	l.showI();
	if(!sameI(l,b))cout<<"are not the same i"<<endl;//調用公共友元函數時不能指明友元函數所屬的類,因爲此友元函數根本就不屬於任何類!
	else cout<<"are the same i"<<endl;
	b.add();
	b.showI();
	l.showI();
	b.add(l);
	b.showI();
	l.showI();
	b.add2(l);
	b.showI();
	l.showI();

	b.showLine();
	b.showLine(l);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章