
- C++基礎
- C++主頁
- C++概述
- C++環境設定
- C++基本語法
- C++註釋
- C++ Hello World
- C++省略名稱空間
- C++常量/字面量
- C++關鍵字
- C++識別符號
- C++資料型別
- C++數值資料型別
- C++字元資料型別
- C++布林資料型別
- C++變數型別
- C++變數作用域
- C++多個變數
- C++基本輸入/輸出
- C++修飾符型別
- C++儲存類
- C++運算子
- C++數字
- C++列舉
- C++引用
- C++日期和時間
- C++控制語句
- C++決策制定
- C++ if 語句
- C++ if else 語句
- C++巢狀if語句
- C++ switch 語句
- C++巢狀switch語句
- C++迴圈型別
- C++ while 迴圈
- C++ for 迴圈
- C++ do while 迴圈
- C++ foreach 迴圈
- C++巢狀迴圈
- C++ break 語句
- C++ continue 語句
- C++ goto 語句
- C++建構函式
- C++建構函式和解構函式
- C++複製建構函式
C++友元函式
C++友元函式
類的友元函式定義在類作用域之外,但它有權訪問類的所有私有和保護成員。即使友元函式的原型出現在類定義中,友元也不是成員函式。
友元可以是函式、函式模板、成員函式或類或類模板,在這種情況下,整個類及其所有成員都是友元。
宣告友元函式
要將函式宣告為類的友元,請在類定義中使用關鍵字**friend**在函式原型之前:
語法
class Box { double width; public: double length; friend void printWidth( Box box ); void setWidth( double wid ); };
要將 ClassTwo 類的所有成員函式宣告為 ClassOne 類的友元,請在 ClassOne 的定義中新增以下宣告:
friend class ClassTwo;
友元函式示例
以下是 C++ 中友元函式的程式碼:
#include <iostream> using namespace std; class Box { double width; public: friend void printWidth( Box box ); void setWidth( double wid ); }; // Member function definition void Box::setWidth( double wid ) { width = wid; } // Note: printWidth() is not a member function of any class. void printWidth( Box box ) { /* Because printWidth() is a friend of Box, it can directly access any member of this class */ cout << "Width of box : " << box.width <<endl; } // Main function for the program int main() { Box box; // set box width without member function box.setWidth(10.0); // Use friend function to print the wdith. printWidth( box ); return 0; }
編譯並執行上述程式碼後,將產生以下結果:
Width of box : 10
訪問私有和保護成員
類的私有和保護成員在類外部是不可訪問的。但是,如果要訪問它們,可以使用友元函式。友元函式提供了直接訪問類私有和保護成員的能力。
示例
以下示例演示了使用友元函式訪問類的私有和保護成員。
#include <iostream> using namespace std; class ClassName { private: int privateData; // Private member protected: int protectedData; // Protected member public: ClassName() : privateData(0), protectedData(0) {} // Declare a friend function friend void friendFunction(ClassName& obj); }; // Friend function definition void friendFunction(ClassName& obj) { obj.privateData = 42; // Access private member obj.protectedData = 24; // Access protected member cout << "Private Data: " << obj.privateData << endl; cout << "Protected Data: " << obj.protectedData << endl; } int main() { ClassName obj; friendFunction(obj); // Call the friend function return 0; }
編譯並執行上述程式碼後,將產生以下結果:
Private Data: 42 Protected Data: 24
友元函式與成員函式
在 C++ 中,友元函式和成員函式都用於訪問和操作類的成員資料,但是它們在作用域和用法上存在顯著差異。
友元函式
友元函式是非成員函式,它在類內使用“friend”關鍵字宣告,它可以特殊訪問類的私有和保護成員。由於它不是成員函式,因此它不繫結到特定物件,不能根據物件過載,不能使用this指標,也不能被派生類繼承。它們定義在類之外,但在類內宣告。
成員函式
而成員函式定義在類內,並使用 this 指標操作。它可以訪問類的所有成員(私有、保護和公有),並且因為它與類物件繫結,所以它可以被過載和被派生類繼承。
友元類
在 C++ 中,友元類是可以訪問另一個類私有和保護成員的類。當一個類宣告另一個類為友元時,第二個類(友元)可以直接訪問第一個類的私有和保護成員。
這個概念類似於友元函式,但這裡友元是整個類而不是特定函式。
語法
以下是 C++ 中友元類的語法:
class ClassB; // Forward declaration of ClassB class ClassA { private: int dataA; public: // Declare ClassB as a friend of ClassA friend class ClassB; };Example
The following example demonstrates the example of a friend class in C++:
#include <iostream> using namespace std; class ClassB; // Forward declaration of ClassB class ClassA { private: int dataA; public: ClassA() : dataA(42) {} // Initialize dataA with a value // Declare ClassB as a friend of ClassA friend class ClassB; }; class ClassB { public: void showDataFromA(const ClassA& objA) { // Access private member of ClassA cout << "Data from ClassA: " << objA.dataA << endl; } }; int main() { ClassA objA; ClassB objB; // Use ClassB to access ClassA's private data objB.showDataFromA(objA); return 0; }Advertisements