概念
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:成員函數做友元