您的位置:

C++友元函数:声明与定义

友元函数在类外定义

友元函数在C++中被定义为类的友元函数,可以在类外单独定义。这意味着友元函数不是类的成员函数,它们被允许访问类的私有和受保护的成员。


// 声明
class MyClass {
   friend void myFriendFunc(MyClass obj);
   private:
      int x;
};

// 定义
void myFriendFunc(MyClass obj) {
   cout << "X的值是:" << obj.x << endl;
}

以上代码中,myFriendFunc()函数被声明为MyClass类的友元函数。 在定义中,我们可以访问类的私有变量x。

友元函数类外定义格式

友元函数的类外定义遵循以下格式:


返回类型 function-name (参数) {
   ... ... ...
}

友元函数怎么定义和使用

友元函数通过类的声明和定义来定义。在C++中,我们将友元函数的声明放在类的定义中,而将其定义放在类外。


#include 
   
using namespace std;

class Box {
   double width;
   public:
      friend void printWidth( Box box );
      void setWidth( double wid );
};

// 成员函数定义
void Box::setWidth( double wid ) {
   width = wid;
}

// 注意:printWidth() 不是任何类的成员函数
void printWidth( Box box ) {
   /* 因为 printWidth() 是 Box 的友元,它可以直接访问该类中的任何成员 */
   cout << "Width of box : " << box.width <
    
   

在上面的程序中,我们声明了一个Box类和一个printWidth()友元函数。printWidth()函数可以访问Box类中的所有成员。在setDoulbe()成员函数的定义中,我们将宽度width设置为wid,而printWidth()函数在输出时直接访问了width变量,这是由于它是一个Box类的友元函数。

友元函数必须在类的外部定义

在C++中,友元函数必须在类的外部定义。 这意味着,如果一个友元函数在类中没有定义,但在类外使用,将会产生一个编译错误。


class MyClass {
   friend void myFriend(MyClass obj);
   private:
      int x;
};

int main() {
  MyClass myObj;
  myFriend(myObj);  //会出错
  return 0;
}

void myFriend(MyClass obj) {
   cout <<"X的值是:" << obj.x << endl;
}

在上面的程序中,我们在主函数中试图访问MyClass类的myFriend()友元函数。由于我们在类外定义了这个函数,但没有在类定义中声明,因此编译器会产生一个错误。

简述友元函数的声明和定义方法

友元函数可以在类的定义中声明和在类外定义。在类的定义中,我们只需要在类的开始或结尾声明友元函数,并且不必定义它。 在类的外部定义友元函数时,我们需要先声明它后再定义它。 声明友元函数时,我们使用关键字friend并向函数传递参数,这样它就可以访问类的私有成员。

友元函数的声明和定义

在以下示例中,我们声明了一个叫做MyFunction的友元函数,并在程序结束时调用它:


#include 
    
using namespace std;

class MyClass {
   friend void MyFunction(MyClass&);  // 友元声明
   public:
      int hello() {return 0;}
};

int main() {
   MyClass obj;
   MyFunction(obj); // 友元函数调用
   return 0;
}

void MyFunction(MyClass &obj) {  // 友元定义
   cout << "Hello, World!" << obj.hello() << endl;
}

    

友元函数怎么定义

友元函数与一般的函数定义非常相似。 唯一的区别是,在友元函数的开头使用关键字friend。


#include 
    
using namespace std;

class MyClass {
   friend void MyFunction(MyClass&);
   public:
      int x;
};

/* 这是MyClass的友元函数定义,我们可以调用它 */
void MyFunction(MyClass &obj) {
   /* 可以访问类中的成员 */
   cout << "X的值是:" << obj.x << endl;
}

    

友元函数必须在类外定义吗

在C++中,友元函数必须在类外定义。 友元函数是被定义为类的友元的函数,因此它们需要在类的外部定义。 如果你仅仅在类中声明并不定义友元函数,编译器将会产生一个错误。

友元函数可以在类内定义吗

友元函数可以在类的内部进行定义,但这并不是最佳实践。 友元函数的定义应该放在类的外部,因为它们的目标是访问私有和受保护的成员,从而违反了类的数据抽象原则。 另外,将其定义与声明放在不同的地方会使程序代码更加可读。

完整代码示例:


#include <iostream>
using namespace std;

class Box {
   double width;
   public:
      friend void printWidth( Box box );
      void setWidth( double wid );
};

// 成员函数定义
void Box::setWidth( double wid ) {
   width = wid;
}

// 注意:printWidth() 不是任何类的成员函数
void printWidth( Box box ) {
   /* 因为 printWidth() 是 Box 的友元,它可以直接访问该类中的任何成员 */
   cout << "Width of box : " << box.width <