C++學習筆記之 友元
阿新 • • 發佈:2020-12-04
友元
目錄概念
類的友元函式是定義在類外部,但有權訪問類的所有私有(private)成員和保護(protected)成員。儘管友元函式的原型有在類的定義中出現過,但是友元函式並不是成員函式
全域性函式做友元
#include <iostream> #include <string> using namespace std; class Building { friend void goodGay(Building &b); // 讓全域性函式goodGay作為本類的友元函式 public: string m_SittingRoom; Building() { m_SittingRoom = "客廳"; m_BedRoom = "臥室"; } private: string m_BedRoom; }; // 好基友 全域性函式 可以訪問客廳 也可以訪問臥室 void goodGay(Building &b) { cout << "好基友正在訪問:" << b.m_SittingRoom << endl; cout << "好基友正在訪問:" << b.m_BedRoom << endl; } // 普通朋友 只能訪問客廳 void friend_(Building &b) { cout << "朋友正在訪問:" << b.m_SittingRoom << endl; // cout << "朋友正在訪問:" << b.m_BedRoom << endl; // error: 'std::__cxx11::string Building::m_BedRoom' is private } int main() { Building b; goodGay(b); friend_(b); return 0; }
好基友正在訪問:客廳
好基友正在訪問:臥室
朋友正在訪問:客廳
類做友元
#include <iostream> #include <string> using namespace std; class Building; class GoodGay { public: GoodGay(); void visit(); Building *building; }; class Building { friend class GoodGay; // 讓GoodGay類成為友元 public: string m_SittingRoom; Building() { m_SittingRoom = "客廳"; m_BedRoom = "臥室"; } private: string m_BedRoom; }; GoodGay::GoodGay() { building = new Building; } void GoodGay::visit() { cout << "好基友類正在訪問:" << building->m_SittingRoom << endl; cout << "好基友類正在訪問:" << building->m_BedRoom << endl; } int main() { GoodGay goodGay; goodGay.visit(); return 0; }
好基友類正在訪問:客廳
好基友類正在訪問:臥室
類中成員函式做友元
#include <iostream> #include <string> using namespace std; class Building; class GoodGay { public: GoodGay(); void visit(); Building *building; void visit2(); }; class Building { friend void GoodGay::visit(); // 讓GoodGay類中的 visit函式 成為友元 public: string m_SittingRoom; Building() { m_SittingRoom = "客廳"; m_BedRoom = "臥室"; } private: string m_BedRoom; }; GoodGay::GoodGay() { building = new Building; } void GoodGay::visit() { cout << "好基友類正在訪問:" << building->m_SittingRoom << endl; cout << "好基友類正在訪問:" << building->m_BedRoom << endl; } void GoodGay::visit2() { cout << "好基友類正在訪問:" << building->m_SittingRoom << endl; cout << "好基友類正在訪問:" << building->m_BedRoom << endl; } int main() { GoodGay goodGay; goodGay.visit(); // 只有visit可以訪問 goodGay.visit2(); // error return 0; }