全局函數做友元
#include<iostream>
using namespace std;class Building
{//goodGay全局函數是Building好朋友,可以訪問Building的私有成員 friend void goodGay(Building *building);
public:Building(){m_SittingRoom = "客廳";m_BedRoom = "臥室";}
public:string m_SittingRoom;//客廳
private:string m_BedRoom;//臥室
};//全局函數
void goodGay(Building *building)
{cout<<"好基友全局函數 正在訪問:"<<building->m_SittingRoom<<endl;cout<<"好基友全局函數 正在訪問:"<<building->m_BedRoom<<endl;
}
void test01()
{Building building;goodGay(&building);
}
int main()
{test01();return 0;
}
在全局函數
void goodGay(Building *building)
中為什么要傳入Building *building
指針呢?
友元函數的概念
在C++中,友元函數是一種特殊的函數,它不是類的成員函數,但被允許訪問類的私有成員和保護成員。友元函數可以通過兩種方式實現:
- 友元函數聲明為類的友元:在類的定義中聲明友元函數,這樣友元函數就可以直接訪問類的私有成員和保護成員。
- 傳遞類的對象或指針給友元函數:即使友元函數不是類的成員函數,通過傳遞類的對象或指針給友元函數,也可以實現訪問私有成員和保護成員的目的。
在代碼中的體現
代碼中展示了第二種方式:全局函數 goodGay
被聲明為類 Building
的友元函數,并通過傳遞 Building *building
指針來訪問 Building
類的私有成員 m_SittingRoom
和 m_BedRoom
。
為什么使用指針作為參數?
在這里,使用指針作為參數有以下幾個原因:
-
直接訪問類的私有成員:指針可以直接操作對象的成員,包括私有成員,因為指針的訪問權限通常比對象的成員函數更靈活。
-
避免對象的復制:如果使用對象作為參數,會涉及到對象的復制構造函數,特別是當對象較大或者復制開銷較大時,效率可能不高。使用指針避免了這種復制。
-
C++語言的傳統做法:在傳遞大型對象時,通常會使用指針或引用,而不是直接復制對象。
示例中的具體情況
在 test01
函數中,創建了一個 Building
對象 building
,并將其地址作為參數傳遞給 goodGay
函數。在 goodGay
函數內部,通過指針訪問了 building
對象的私有成員 m_SittingRoom
和 m_BedRoom
。
void goodGay(Building *building)
{cout << "好基友全局函數 正在訪問:" << building->m_SittingRoom << endl;cout << "好基友全局函數 正在訪問:" << building->m_BedRoom << endl;
} void test01()
{Building building;goodGay(&building); // 將building對象的地址傳遞給goodGay函數
}
因此,使用指針作為參數是為了在全局函數中訪問類的私有成員,并且遵循了C++中友元函數的設計原則,允許在不將函數定義為類的成員函數的情況下訪問私有成員。