friend关键字可以修饰普通函数和类成员函数。被修饰的函数,可以访问类的私有和保护成员变量。由于该关键字带来了很大的便利,但也破坏了类的封装性,所以对其使用进行了限制:
- 友元关系不能继承。
- 友元关系是单向的。
- 友元关系不会传递。
友元函数
在类内声明,在类外定义。
#include <iostream>
class num {
int m_a;
public:
num(int a) : m_a(a) {}
friend void show_num(num &n);
};
void show_num(num &n) { std::cout << n.m_a << std::endl; }
int main(void) {
num n{1};
show_num(n); // 输出: 1
}
友元类
在类内声明,在类外定义。
#include <iostream>
class num {
int m_a;
public:
num(int a) : m_a(a) {}
friend class num_friend;
};
class num_friend {
public:
void show_num(num &n) { std::cout << n.m_a << std::endl; }
};
int main(void) {
num n{1};
num_friend nf;
nf.show_num(n); // 输出: 1
}