友元函數(shù)允許外部函數(shù)訪問類中的私有或受保護成員,通過在類定義中用 friend 關鍵字聲明。與成員函數(shù)不同,友元函數(shù)聲明在類外部,可訪問類的私有和保護成員,而成員函數(shù)在類內(nèi)部聲明,可訪問類所有成員。友元函數(shù)用作普通函數(shù)調(diào)用,而成員函數(shù)用類對象調(diào)用,在需要外部訪問私有或受保護成員時使用友元函數(shù),在類內(nèi)部使用成員函數(shù)時使用成員函數(shù)。
C++ 友元函數(shù)詳解:友元函數(shù)與成員函數(shù)的區(qū)別
友元函數(shù)
友元函數(shù)是一種允許外部函數(shù)訪問類中的私有和保護成員的特殊函數(shù)。它通過在類定義中使用 friend
關鍵字聲明。
語法:
class MyClass { friend void myFriendFunction(); ... };
登錄后復制
成員函數(shù)
成員函數(shù)是屬于類的函數(shù),可以訪問其私有和保護成員。
語法:
class MyClass { void myMemberFunction(); ... };
登錄后復制
友元函數(shù)和成員函數(shù)的區(qū)別
特征 | 友元函數(shù) | 成員函數(shù) |
---|---|---|
可訪問性 | 可以訪問類的私有和保護成員 | 可以訪問類的所有成員 |
聲明位置 | 在類外部 | 在類內(nèi)部 |
作用域 | 全局 | 類內(nèi)部 |
調(diào)用方式 | 像普通函數(shù)一樣調(diào)用 | 使用類對象調(diào)用 |
實戰(zhàn)案例
考慮一個 Student
類,它具有私有的 marks
成員:
class Student { private: int marks; ... };
登錄后復制
我們可以使用友元函數(shù) calculateAverage()
來計算學生的平均成績,該函數(shù)可以訪問 marks
:
// 友元函數(shù) friend double calculateAverage(Student& student); // 計算學生的平均成績 double calculateAverage(Student& student) { return student.marks / 3; }
登錄后復制
我們也可以使用成員函數(shù)來計算平均成績,但它只能在 Student
類中使用:
// 類的成員函數(shù) double getAverage() { return marks / 3; }
登錄后復制
結論
友元函數(shù)提供了一種機制,允許外部函數(shù)訪問類的私有和保護成員,而不需要使這些成員對外部世界可見。成員函數(shù)可以訪問類的所有成員,但只能在類內(nèi)部使用。