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