C++ 友元函数

C++ 友元函数

C++中,如果一个函数被定义为友元函数,则可以使用该函数访问类的保护和私有数据。

通过使用关键字friend,编译器知道该给定函数是一个友元函数。

为了访问数据,友元函数的声明应该在类的主体内部以关键字friend开头进行。

C++中友元函数的声明

class class_name  
{  
    friend data_type function_name(argument/s);            // syntax of friend function.
};  

在上述声明中,friend函数的前面有关键字friend。该函数可以像普通的C++函数一样在程序的任何地方定义。函数定义不使用friend关键字 或作用域解析运算符

Friend函数的特点:

  • 该函数不在声明为friend的类的作用域内。
  • 它不能使用对象调用,因为它不在该类的作用域内。
  • 可以像普通函数一样调用,不需要使用对象。
  • 它不能直接访问成员名称,必须使用对象名和点成员运算符加上成员名称。
  • 可以在私有部分或公共部分声明。

C++友元函数示例

让我们看一个简单的C++友元函数示例,用于打印一个盒子的长度。

#include <iostream>  
using namespace std;  
class Box  
{  
    private:  
        int length;  
    public:  
        Box(): length(0) { }  
        friend int printLength(Box); //friend function  
};  
int printLength(Box b)  
{  
   b.length += 10;  
    return b.length;  
}  
int main()  
{  
    Box b;  
    cout<<"Length of box: "<< printLength(b)<<endl;  
    return 0;  
}  

输出:

Length of box: 10  

让我们看一个简单的例子,当函数对两个类友好时。

#include <iostream>
using namespace std;
class B;          // forward declarartion.
class A
{
    int x;
    public:
    void setdata(int i)
    {
        x=i;
    }
    friend void min(A,B);         // friend function.
};
class B
{
    int y;
    public:
    void setdata(int i)
    {
        y=i;
    }
    friend void min(A,B);                    // friend function
};
void min(A a,B b)
{
    if(a.x<=b.y)
    std::cout << a.x << std::endl;
    else
    std::cout << b.y << std::endl;
}
   int main()
{
   A a;
   B b;
   a.setdata(10);
   b.setdata(20);
   min(a,b);
    return 0;
 }

输出:

10

在上面的例子中,min()函数对两个类友好,也就是说,min()函数可以访问类A和类B的私有成员。

C++友元类

友元类可以访问它声明为友元的类中的私有和受保护成员。

让我们看一个友元类的简单例子。

#include <iostream>

using namespace std;

class A
{
    int x =5;
    friend class B;           // friend class.
};
class B
{
  public:
    void display(A &a)
    {
        cout<<"value of x is : "<<a.x;
    }
};
int main()
{
    A a;
    B b;
    b.display(a);
    return 0;
}

输出:

value of x is : 5

在上面的例子中,类B被声明为类A的友元。因此,B是A类的友元。类B可以访问类A的私有成员。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程