一、友元類的概念
在C++中,類(包括其對象)擁有訪問限制,即如果在類的外部定義的函數或對象想要訪問類的私有或保護成員,需要藉助於公有成員函數。這種限制保護了類的封裝性,但是也帶來了一定的不便。
為了能夠方便地訪問類的私有或保護成員,C++引入了友元類(friend class)的概念。
class A{ private: int n; public: void func(); friend class B;//友元類聲明 }; class B{ public: void func(A &a);//B類通過A類對象,直接訪問A類的私有成員n };
二、友元類的作用
友元類能夠訪問另一個類的私有或保護成員,這意味着,我們可以把多個類放在一起,讓它們互相訪問和操作彼此的私有成員,也就是說,友元類提供了一種控制類之間訪問權的機制,增強了類之間的靈活性和多樣性。
例如,在圖形學中,我們需要定義許多類表示不同的圖形對象,每個類都必須維護自己的一套數據和操作,但是它們之間也需要互相引用和操作,那麼這時候友元類就非常有用,可以使得每一個圖形對象得到需要的信息,進行相應的操作。
三、友元類的使用
要使用友元類,需要在類的定義中聲明友元類,這樣在友元類中就可以直接訪問當前類的私有和保護成員了。
需要注意的是,友元類的聲明只是為了讓這個類能夠直接訪問當前類的私有和保護成員,但並不意味着當前類也能訪問友元類的私有和保護成員。
下面的例子中,類B是類A的友元類,能夠直接訪問類A的私有成員func1()。但是類A並不是類B的友元類,所以不能直接訪問類B中的私有成員func2()。
class B; class A{ private: int n; void func1(){ n = 1; } public: friend class B; }; class B{ private: int m; void func2(){ m = 2; } public: void func(A &a){ a.func1(); } };
四、友元類的注意事項
1、友元關係不能被繼承。即使子類繼承了父類的友元類,也不能訪問父類的私有成員。
2、友元關係是單向的。如果類A是類B的友元類,不代表類B也是類A的友元類。
3、友元類和友元函數具有相同的權限特點,都能夠直接訪問當前類的私有成員,但是這樣做會破壞類的封裝性,不利於代碼復用和維護,應該謹慎使用。
五、實戰演練
下面通過一個實際的例子來演示友元類的使用。
假設我們需要設計一個遊戲角色類(Character),其中包括角色的基本屬性和攻擊方式。同時,我們需要設計一個技能類(Skill),其中包括技能的名稱和傷害值。
技能類需要能夠直接訪問角色類的私有成員,以便於計算技能的攻擊傷害。
class Character;//前置聲明,以便於Skill類中的訪問 class Skill{ private: int damage; string name; public: Skill(int d, string n){ damage = d; name = n; } void attack(Character &c); }; class Character{ private: int hp; int mp; friend class Skill;//友元類聲明,Skill類可以訪問Character類的私有成員 public: Character(int h, int m){ hp = h; mp = m; } void display(){ cout<<"HP: "<<hp<<endl<<"MP: "<<mp<<endl; } }; void Skill::attack(Character &c){ c.hp -= damage; } int main(){ Character c(100, 50); Skill s(20, "Fireball"); c.display(); s.attack(c); c.display(); return 0; }
六、總結
友元類是一種讓多個類之間互相訪問和操作彼此的私有成員的技術。友元類的聲明和使用雖然能夠方便地處理一些問題,但會破壞類的封裝性,不利於代碼的維護和管理,應該慎重使用。
原創文章,作者:EEBTX,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/331917.html