天天看點

C++:類和對象: 友元概念1:全局函數做友元 2:類做友元 3:成員函數做友元 

概念

1:程式中,某個類的私有屬性 可以讓類外  一些特殊函數或者類進行通路,這個就是友元技術 。

2:  有元的關鍵字是 : friend。

3:友元的三種實作:

全局函數做友元

類做友元

成員函數做友元

1:全局函數做友元 

案例:在類中直接在全局函數的聲明添加 friend 即可。同時,不需要為其指定通路權限,直接放進去即可。

#include<iostream>
#include<string>
using namespace std;
class Building {
	// 通過firend修飾,可以告訴編譯器:goodGay是全局函數,可以通路 類 Building中的私有成員變量
	friend void goodGay(Building* building);
public:
	Building() {
		this->m_settingRoom = "客廳";
		this->m_bedRoom = "卧室";
	}

	string m_settingRoom; // 客廳
private:
	string m_bedRoom; // 卧室

};

void goodGay(Building* build) {
	cout << "通路:" << build->m_settingRoom << endl;
	cout << "通路:" << build->m_bedRoom << endl;
}

int main() {
	Building b;
	goodGay(&b);
	return 0;
}
           
C++:類和對象: 友元概念1:全局函數做友元 2:類做友元 3:成員函數做友元 

 根據運作結果可知:

有元全局函數可以通路到 私有成員變量。

2:類做友元 

案例:我們假設goodGay類有一個Building類的私有成員變量 building,而Building類存在一些 私有成員,如果我們想讓 goodGay對象能夠 通路 Building類的私有成員。那麼我們就需要讓 goodGay稱為 Building類的 友元。

#include<iostream>
#include<string>
using namespace std;
class Building;
class goodGay {
public:
	goodGay();
	void visit();
private:
	Building* building;

};

class Building
{
	// 告訴編譯器 googGay類 Building類的 友元類,可以通路 Building類中的私有内容。
	friend class goodGay;
public:
	Building(); // 提供預設構造函數
	string m_settingRoom; // 客廳
private:
	string m_bedRoom; //卧室

};

// 通過 Building:: 作用域也可以通路 這些成員變量
Building::Building() {
	this->m_bedRoom = "卧室";
	this->m_settingRoom = "客廳";
}

// 構造函數:直接構造一個 Building對象
goodGay::goodGay() {
	building = new Building();
}

void goodGay::visit() {
	
	cout << "通路:" << building->m_settingRoom << endl;
	// 因為 Building類聲明 友元類 goodGay,是以可以通路 Building類中的私有成員屬性 m_bedRoom
	cout << "通路: " << building->m_bedRoom << endl;
}

int main() {
	goodGay gg;
	gg.visit();
}

           
C++:類和對象: 友元概念1:全局函數做友元 2:類做友元 3:成員函數做友元 

 運作結果可知:

goodGay是可以通路到 Building類中的私有成員變量。

3:成員函數做友元 

案例:現在goodGay裡面有兩個成員函數 visit1 和 visit2 。如果我們隻想讓 visit1作為 Building的友元函數,------那麼就可以将 visit1的聲明直接 寫到 Building類中。

#include<iostream>
#include<string>
using namespace std;

class Building;
class goodGay {
public:
	goodGay();
	void visit1();
	void visit2();

private:
	Building* building;
};

class Building {
	// 告訴編譯器 goodGay類中 visit1()成員函數是 Building類中的友元函數,可以通路其私有内容。
	friend void goodGay::visit1();

public:
	Building();
	string m_SettingRoom;
private:
	string m_bedRoom;
};

Building::Building() {
	this->m_bedRoom = "卧室";
	this->m_SettingRoom = "客廳";
}

goodGay::goodGay() {
	building = new Building();
}

void goodGay::visit1() {
	cout << "通路私有變量:" << building->m_bedRoom << endl;
}

void goodGay::visit2() {
	cout << "通路公共變量:" << building->m_SettingRoom << endl;
}

int main() {
	goodGay gg;
	gg.visit1();
	gg.visit2();
	return 0;
}
           
C++:類和對象: 友元概念1:全局函數做友元 2:類做友元 3:成員函數做友元 
從運作結果可知:友元成員函數可以通路對象的私有成員變量。

繼續閱讀