文章

C++ friend友元

C++ friend友元

概述

友元提供了一种非成员函数或者其他类,访问另一个类中的私有或保护成员的方法。

友元分为:

  • 友元函数:普通函数访问某个类中的私有或保护成员
  • 友元类:类A中的成员函数访问类B中的私有或保护成员
  • 友元成员函数:某个类的特定成员可以访问另一个类的私有或保护成员

友元的存在提高了程序的运行效率,但是破坏了类的封装性和数据透明性

友元函数

在类声明的任何区域中声明,但是定义在类的外部

1
friend <类型><友元函数名>(<参数表>)

友元函数只是一个普通函数,而不是该类的成员函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>

using namespace std;

class A
{
public:
    A(int _a):a(_a){};
    friend int geta(A &ca);  ///< 友元函数
private:
    int a;
};

int geta(A &ca) 
{
    return ca.a;
}

int main()
{
    A a(3);    
    cout<<geta(a)<<endl;

    return 0;
}

友元类

友元类的声明在该类的声明中,而实现在该类外

1
friend class <友元类名>;

如果类B是类A的友元,那么类B可以直接访问类A的私有成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>

using namespace std;

class A
{
public:
    A(int _a):a(_a){};
    friend class B;
private:
    int a;
};

class B
{
public:
    int getb(A ca) {
        return  ca.a; 
    };
};

int main() 
{
    A a(3);
    B b;
    cout<<b.getb(a)<<endl;
    return 0;
}

友元关系是单项的,且不能被继承

友元成员函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;

class Engine; // 前向声明

class Car {
public:
    void show(const Engine& e);
};

class Engine {
private:
    int power = 250;
    friend void Car::show(const Engine&); // 指定Car的某个成员函数为友元
};

void Car::show(const Engine& e) {
    cout << "Engine power: " << e.power << " HP" << endl;
}

注意事项

  • 友元关系不是继承的,继承后的类也无法访问私有成员,或者继承后的类也声明为友元类
  • 友元关系不是传递的,不存在友元的友元这种关系
本文由作者按照 CC BY 4.0 进行授权