© whiteMocca/Shutterstock.com

在編程世界中,有很多可供選擇的語言。其中許多被稱為面向對象的編程語言,它們專注於圍繞對象設計程序以及它們如何相互交互。

為此,對象的屬性由類定義,用於包含數據以及對該數據進行操作的代碼。

A面向對象語言的流行示例是 C++,它的大部分用法涉及友元函數和友元類。在本文中,我們將了解什麼是友元函數和友元類,以及它們如何與 C++ 一起使用。

什麼是友元函數和類?

隱藏或封裝數據是面向對象編程中的一個關鍵原則,通常是為了提供更友好的界面,以便與特定代碼塊的功能交互或限制對功能的訪問。但是,有時您可能希望某個類中的代碼能夠被該類之外的函數訪問。

這就是 friend 關鍵字和 friend 函數發揮作用的地方。友元函數可以訪問受保護的私有數據,並且可以使用 friend 關鍵字聲明。因此,友元函數可用於對一個或多個類的對象進行操作。

值得注意的是,友元函數可以是成員函數(與特定類關聯)或全局函數(在任何類之外定義)。

友元函數是具有特殊訪問權限的普通外部函數。

©gonin/Shutterstock.com

朋友類的功能類似,但是,由於整個類都是另一個類的“朋友”,所以朋友類的所有成員函數都可以訪問所有其他班級的成員。

換句話說,友元函數被聲明為特定類的友元,而友元類是在您希望它成為友元的類中定義的。

如何使用友元函數

既然我們已經介紹了什麼是友元函數和類,是時候看一個如何實現友元函數的例子了:

class MyClass { private: int X; public: friend void myFriendFunction(MyClass& obj) { obj.x=10; } }

在這裡,我們將“myFriendFunction”函數定義為類“MyClass”的友元。因此,該函數是在類定義中聲明的,並且可以訪問該類的私有成員“x”。

如何使用全局友元函數

如果我們想將友元函數聲明為全局函數,我們必須在類定義之外定義它。這可以與前面的示例非常相似地完成:

class MyClass { private: int x; public: friend void my GlobalFriendFunction(MyClass& obj); }; void myGlobalFriendFunction(MyClass& obj) { obj.x=10; }

代碼本質上是一樣的,除了友元函數定義在類之外。因此,這個友元函數可能是任何類的友元,因為它沒有在類中定義。

如何將一個函數聲明為多個類的友元

你不必僅僅停留在使一個函數對一個類友好。函數可以與多個類成為朋友。請參閱下面的操作方法:

class MyClass1;類 MyClass2 { 私有:int y; public: friend void myFriendFunction(MyClass1&, MyClass2&); };類 MyClass1 { private: int x; public: friend void myFriendFunction(MyClass1&, MyClass2&); }; void myFriendFunction(MyClass1& obj1, MyClass2& obj2) { obj1.x=10; obj2.y=20; }

在這裡,我們定義了兩個類,“MyClass1”和“MyClass2”,以及“myFriendFunction”全局函數。 friend 函數是在兩個類定義中聲明的,因此可以修改這兩個對象的私有成員。即,成員“x”和“y”。請注意,第一行用於轉發聲明“MyClass1”。

好友類可以訪問它被聲明為朋友的類的私有和受保護成員。

©Yurchanka Siarhei/Shutterstock.com

這讓編譯器知道“MyClass1”的存在而無需先定義它.這樣做是為了在編譯友元函數的聲明時考慮“MyClass1”,避免編譯錯誤。

如何使用友元類

在前面的例子中,我們定義了“myFriendFunction”作為“MyClass”類的好友。私有成員“x”的訪問和修改被授予朋友類。

但是,朋友類看起來有點不同。這是一個例子:

class MyClass { private: int x; public:朋友類MyFriendClass; };類 MyFriendClass { public: void myFunction(MyClass& obj) { obj.x=10; } }

在這種情況下,類“MyFriendClass”被指定為“MyClass”類的朋友類。其中的每個函數都可以訪問私有成員“x”,例如“myFunction”成員函數。

總結

friend 關鍵字可用於聲明友元函數。這允許函數訪問類的私有成員。您還可以使用 friend 關鍵字來聲明一個友元類。這意味著該類的所有成員函數都可以訪問友好類。

當我們想要授予函數或類對類的特定成員的訪問權限而不向公共接口顯示所有這些受保護成員時,friend 關鍵字很有用。一般情況下,只應在必要時使用該功能。這是為了幫助維護面向對象編程的數據隱藏和封裝原則。

Up Next

C++ 中的友元函數和友元類,常見問題解答(常見問題解答)

什麼是友元函數?

友元函數是使用 friend 關鍵字被授予訪問類私有成員的函數。

p>

什麼是友元類?

友元類的功能類似,除了友元類的所有成員函數都可以訪問其他類的受保護成員。

p>

友元函數是成員函數還是全局函數?

兩者都可以。如果你在類之外定義友元函數,它就是一個全局函數並且可以潛在地訪問其他類。如果它是在類定義中定義的,它只能訪問該類的成員。

為什麼要使用友元函數或類?

他們’re 對於授予對私有或受保護類成員的訪問權限非常有用,而無需將所有這些信息暴露給公共接口。這對於維護數據隱藏和封裝很重要。

友元函數可以訪問子類的成員嗎?

不能,如果它是在基類中定義的那麼就不能訪問子類的成員了。

友元函數對性能有影響嗎?

不會,友元函數只影響私有類的可見性

朋友類可以繼承嗎?

是的,朋友類可以繼承。

By Henry Taylor

我是後端開發人員。 你們中有些人可能在開發者大會上見過我。 最近我一直在做一個開源項目。