友元函数和友元类

友元

友元是 C++ 提供的一种 打破封装 的机制,允许 友元函数友元类 访问某个类的 非公有成员(private/protected)

友元函数

友元函数 可以 直接访问 类的所有 成员,它是 定义在类外部普通函数 ,不属于任何类,但需要在类的内部声明,声明时需要加friend 关键字。

运算符重载(<<, >>

cpp 复制代码
class Student {
private:
    std::string name;
    int age;

public:
    Student(std::string n, int a) : name(n), age(a) {}

    // 声明友元函数(用于 operator<<)
    friend std::ostream& operator<<(std::ostream& os, const Student& s);
};

// 定义 operator<<(可以访问私有成员)
std::ostream& operator<<(std::ostream& os, const Student& s) {
    os << "Name: " << s.name << ", Age: " << s.age;
    return os;
}

int main() {
    Student s("Alice", 20);
    std::cout << s << std::endl;  // 输出:Name: Alice, Age: 20
    return 0;
}

假设<<重载为成员函数,那 对象就是第一个参数,cout是第二个参数,使用时就是a << cout

同理,如果>>重载成成员函数,那使用时就是 a >> cin,所以<<和>>不能重载成成员函数

重载为全局函数,那第一个参数就可以设置为cout和cin了,使用时就是cout<<a和 cin>>a,这就对味了,并设置友元函数使其可以直接访问非公有成员

友元类

友元类的所有成员函数都是另一个类的友元函数,友元类的所有成员函数都可以访问另一个类中的非公有成员。
1.友元关系是单向的,不具有交换性。
比如上述Time 类和 Date 类,在 Time 类中声明 Date 类为其友元类,那么可以在 Date 类的成员函数中可以直接访问 Time 类的私有成员变量,但想在Time 类中访问 Date 类中私有的成员变量则不行。
2.友元关系不能传递
如果 B 是 A 的友元, C 是 B 的友元,则不能说明 C 时 A 的友元。
3.友元关系不能继承

内部类

如果一个类定义在另一个类的内部,这个类就叫做内部类
注意内部类是外部类的友元类
特性:

  1. 内部类可以定义在外部类的 public 、 protected 、 private 都是可以的。
  2. sizeof( 外部类 )= 外部类,和内部类没有任何关系。
相关推荐
AI科技星1 小时前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘
charlie1145141912 小时前
嵌入式C++实践开发第21篇(单片机实践):按钮输入 —— 硬件原理、消抖与HAL API
开发语言·c++·单片机
前端老石人2 小时前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html
0xDevNull2 小时前
Java泛型详解
java·开发语言·后端
yeeanna2 小时前
GO函数的特殊性
开发语言·后端·golang
AKDreamer_HeXY2 小时前
QOJ 12255 - 36 Puzzle 题解
数据结构·c++·数学·算法·icpc·qoj
AI科技星2 小时前
《全域数学》第三卷:代数原本 · 全书详述【乖乖数学】
开发语言·人工智能·机器学习·数学建模
时空系2 小时前
第10篇:归属权与借用——Rust的安全保障 Rust中文编程
开发语言·安全·rust
AI进化营-智能译站2 小时前
ROS2 C++开发系列13-运算符重载让ROS2消息处理更自然
java·开发语言·c++·ai
时空系2 小时前
第6篇:数据容器——管理大量数据 Rust中文编程
开发语言·后端·rust