C++中的friend關鍵字有什么用途?怎么用?

friend關鍵字允許外部函數或類訪問當前類的私有和受保護成員,用于特定場景下的靈活設計。1. 可將外部函數聲明為友元,使其能訪問類的私有成員,如用于重載運算符或打印信息;2. 可將整個類聲明為友元類,使該類的所有成員函數都能訪問當前類的私有成員,適用于管理類需訪問多個類內部狀態的情況;3. 常用于通過友元函數重載運算符,例如輸出流操作符,以實現對象的直接輸出。需注意:友元關系不可逆、不繼承,且應謹慎使用以避免破壞封裝性。

C++中的friend關鍵字有什么用途?怎么用?

c++中,friend關鍵字的作用是打破類的封裝性,讓某些外部函數或類可以訪問該類的私有(private)和受保護(protected)成員。這并不是鼓勵濫用,而是在特定場景下非常有用。


1. 讓外部函數成為“朋友”

有時候我們需要一個不屬于類本身的函數來訪問類的私有成員,比如重載運算符或者打印類內部信息時。這時就可以使用friend。

用法示例:

立即學習C++免費學習筆記(深入)”;

class MyClass { private:     int value; public:     MyClass(int v) : value(v) {}     friend void printValue(const MyClass& obj); // 聲明友元函數 };  void printValue(const MyClass& obj) {     std::cout << "Value: " << obj.value << std::endl; // 可以訪問私有成員 }

這個函數不是類的成員函數,但它可以訪問類的所有私有內容。

注意:友元函數不能通過對象調用,它就是一個普通的函數,只是被授予了“特權”。


2. 讓另一個類成為“朋友類”

如果你希望一個類能夠完全訪問另一個類的私有成員,可以把整個類聲明為友元。

適用場景: 比如一個管理類需要訪問多個其他類的內部狀態。

class Helper;  class Data { private:     int secret; public:     Data(int s) : secret(s) {}     friend class Helper; // Helper是Data的朋友 };  class Helper { public:     void showSecret(Data& d) {         std::cout << "Secret: " << d.secret << std::endl; // 合法,因為是友元類     } };

這樣,Helper類中的所有成員函數都可以訪問Data的私有成員。


3. 使用友元函數重載運算符

這是friend最常見的用途之一。當你想讓兩個對象相加、比較或者輸出到流中時,通常會用友元函數實現。

例如,重載

class Point { private:     int x, y; public:     Point(int a, int b) : x(a), y(b) {}     friend std::ostream& operator<<(std::ostream& os, const Point& p); };  std::ostream& operator<<(std::ostream& os, const Point& p) {     os << "(" << p.x << ", " << p.y << ")";     return os; }

這樣你就可以直接寫:

Point p(3, 4); std::cout << p; // 輸出 (3, 4)

幾個注意事項:

  • 友元關系 不是雙向的:A是B的朋友,不代表B是A的朋友。
  • 友元關系 不能繼承子類不會自動擁有父類的友元權限。
  • 盡量少用friend:它破壞了封裝性,只有在確實需要訪問私有成員時才考慮。

基本上就這些。用得不多但關鍵時刻很有用,別濫用就行。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享