- 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