C++中的友元


前面提到過,在類的封裝中,私有的成員變量和成員函數無法在類外訪問,但是總有那么一些情況需要給類外的對象賦予一定的訪問權限。比如在家里面,客廳是公共訪問權限,而每個人的卧室是私有訪問權限,對大多數人來說不可訪問,但是自己的好朋友可以。同樣的道理,在C++中實現這種功能需要借助友元的機制。簡單來說就是如果某個類外的對象需要訪問類內的私有成員,在類內聲明為友元類型即可。

一、全局函數做友元

在本例中,首先構造了一個 house 類,需要在類內聲明全局函數 Friend 為友元方能訪問類內的私有成員:

class house
{
	friend void Friend(house& p_house);	// friend 是友元的關鍵字
public:
	string livingroom;
private:
	string bedroom;
public:
	house()		// 定義構造函數給成員變量賦值
	{
		livingroom = "客廳";
		bedroom = "卧室";
	}
};

void Friend(house& p_house)
{
	// 可以在類外正常訪問類內的公有成員
	cout << "Friend 正在訪問:" << p_house.livingroom << endl;

	// 將Friend函數聲明為友元方可訪問私有成員
	cout << "Friend 正在訪問:" << p_house.bedroom << endl;
}
int main(void)
{
	house p;	// 實例化house對象
	Friend(p);	// 調用友元函數Friend
}

輸出結果如下所示:

Friend 正在訪問:客廳
Friend 正在訪問:卧室

二、類做友元

想象一下,如果你某天需要出遠門,需要一個朋友定期去你家里面進行打掃,這個時候你就需要給他一定的權限讓他能夠訪問到家里面的任何地方。其實類做友元跟函數做友元一樣,如下例所示:

class house{
    // 將 friend_house 類聲明為house的友元后,該類實例化的對象能夠訪問 house 類對象的所有成員
	friend class friend_house;
public:
	string livingroom;
private:
	string bedroom;
public:
	house()		// 定義構造函數給成員變量賦值
	{
		livingroom = "客廳";
		bedroom = "卧室";
	}
	void show()	// 顯示類內的變量內容
	{
		cout << "livingroom:" << livingroom << endl;
		cout << "bedroom:" << bedroom << endl;
	}
};

class friend_house{
public:
	void visit(house& p_House)
	{
		cout << "friend 正在訪問:" << p_House.livingroom << endl;
        // 將類friend_house 聲明為house的友元后,不僅可以訪問house的公有成員,也能訪問私有成員
		cout << "friend 正在訪問:" << p_House.bedroom << endl;

		p_House.livingroom = "整理后的客廳";	// 由於傳進來的參數是引用類型,可以修改原來house對象的值
		p_House.bedroom = "整理后的卧室";
	}
};
int main(void)
{
	house p;	// 實例化house對象
	friend_house p_friend;	// 
	p_friend.visit(p);	// 訪問並修改house類對象p的成員
	p.show();
}

輸出結果如下:

friend 正在訪問:客廳
friend 正在訪問:卧室
livingroom:整理后的客廳
bedroom:整理后的卧室

三、成員函數做友元

其實無論什么做友元都是一樣的目的,只是友元的聲明格式不同,比如:

  1. 全局函數的聲明:friend void Friend(house& p_house); // friend 是友元的關鍵字
  2. 友元類的聲明:friend class friend_house;
  3. 成員函數的聲明:friend void goodGay::visit1();
class Building;
class goodGay
{
public:
	goodGay();
	void visit1();
	void visit2();
 
private:
	Building * building;
};
//類內聲明,類外實現;
class Building
{
	//讓成員函數visit1做友元函數:
	friend void goodGay::visit1();
public:
	Building();
public:
	string m_sittingroom;	//客廳
private:
	string m_bedroom;		//卧室
};
Building::Building()
{
	this->m_bedroom = "卧室";
	this->m_sittingroom = "客廳";
}
goodGay::goodGay()
{
	building = new Building;
}
void goodGay::visit1()
{
	cout << "基友正在" << this->building->m_sittingroom << endl;
	//要訪問私有屬性的元素;
	//在Building 類中定義友元類:friend class goodGay;
	cout << "基友正在" << this->building->m_bedroom << endl;
 
}
void goodGay::visit2()
{
	cout << "基友正在" << this->building->m_sittingroom << endl;
	//要訪問私有屬性的元素;
	//在Building 類中定義友元類:friend class goodGay;
	//cout << "基友正在" << this->building->m_bedroom << endl;
}
int main()
{
	goodGay g1;
	g1.visit1();
	return 1;
}

輸出結果為:

基友正在客廳
基友正在卧室


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM