11k10 分钟

# std::set # std::set 的构造 std::set 是 C++ 标准库中的一个关联式容器,它根据元素值自动排序,并确保容器中每个元素的唯一性。 默认构造: 创建一个空的 std:: set。 std::set<Key, Compare, Allocator> set1; 复制构造: 使用另一个 std:: set 的内容、比较函数和分配器来构造新的 std:: set。 std::set<Key, Compare, Allocator> set1;std::set<Key, Compare, Allocator> set2(s
57k52 分钟

# 友元 在 C++ 中,类的私有成员(包括私有数据成员和私有成员函数)只能被该类自己的成员函数以及友元函数 / 类访问。友元关系是一种特殊的访问权限,允许非成员函数或类访问另一个类的私有成员。 友元关系通过在类内部使用 friend 关键字声明建立。可以声明友元函数或友元类: 友元函数:可以是 普通函数,也可以是 成员函数,它们可以访问声明它们为友元的类的私有成员。 友元类:整个类的所有成员函数都能访问声明它们为友元的类的私有成员。 友元的三种形式:普通函数、成员函数、友元类 # 普通函数形式 程序中有 Point 类,需要求取两个点的距离。按照设想,我们定义一个普通函
19k18 分钟

# 输入输出流 # 输入输出的含义 在计算机编程中,输入和输出(I/O)是程序与外部世界进行数据交换的基本方式。通常情况下,我们通过终端,也就是键盘和显示器,来进行数据的输入和输出。当我们从键盘键入数据或在屏幕上看到程序的运行结果时,这就是最直观的 I/O 操作。然而,从操作系统的角度来看,所有的输入输出设备,包括键盘、显示器、磁盘驱动器、甚至网络连接等,都可以被视为文件。这意味着,无论是从键盘输入数据还是将数据输出到显示器,或者从磁盘文件读取数据、将数据写入磁盘文件,这些操作都可以用类似的文件 I/O 方法来处理。 在编程语言中,程序的输入指的是将数据从外部来源
62k57 分钟

# 面向对象思想 # 过程论(Procedural Programming) 核心观点: 程序由一系列步骤或过程组成,这些步骤按照一定的顺序执行。 数据和逻辑是分离的,数据是被处理的对象,而逻辑是处理数据的规则。 优点: 逻辑清晰:对于简单的、顺序的任务,过程论可以提供清晰的执行路径。 易于理解和控制:在小型或结构化程度高的应用中,过程论易于理解和控制。 缺点: 可扩展性差:随着系统复杂度的增加,过程论可能导致代码难以管理和维护。 难以适应变化:在需求变化时,过程论的程序可能需要大规模重构。 # 对象论(Object-Oriented Programming, OOP) 核心观点:
42k39 分钟

# 命名空间 # 为什么要使用命名空间 命名冲突指的是在同一个作用域内,存在两个或多个具有相同名称的实体。 在 C 语言中,避免此类冲突通常需要开发者遵循特定的命名约定。例如,通过在变量名前添加开发者的标识符,可以在一定程度上减少冲突的可能性: int hw_cpp_tom_num = 100;int xm_cpp_bob_num = 200;C++ 提供了一种解决方案,即 命名空间。命名空间允许开发者定义自己的命名作用域,使得在不同作用域中可以存在同名的变量或函数,而不会相互干扰。这样,系统能够根据命名空间来区分这些同名实体,从而有效地解决了命名冲突的问题。 # 什么是命
68k1:02

# 需求分析 假设:我们结合学过的文件操作、网络通信、以及进程和线程的知识,实现一个基本的文件下载服务器模型,我们需要做哪些准备工作,或者说我们怎么设计整个数据通信逻辑。 首先,服务器需要能够处理大量连接的频繁接入和断开,这就要求我们不能简单地让一个进程同时处理连接接入和业务逻辑,这样的设计在现代应用领域是低效的。它不仅无法有效解耦,增加了代码书写的复杂性,还增加了并行逻辑设计的难度,并且无法充分利用多核 CPU 的性能,容易导致性能瓶颈。 在设计服务器架构时,我们需要考虑可维护性和性能两个基本要求。可维护性要求应用程序对开发者友好,使得开发和维护人员能够快速理解程序架构并进行后续开发。为了提
53k49 分钟

# 地址处理 # 大端地址和小端地址 # 大端法和小端法 大端法(Big-Endian) 在大端法中,一个多字节值的高位字节(即 “大端”)存储在内存的低地址端,而低位字节(即 “小端”)存储在高地址端。这种存储顺序使得大端法在字节对齐的内存访问中更为直观。 小端法(Little-Endian) 小端法与大端法相反,低位字节存储在内存的低地址端,而高位字节存储在高地址端。这种存储顺序在某些处理器架构中更为常见,如 x86 和 x64 架构。 TCP/IP 协议中的字节序 根据 TCP/IP 协议,当数据在网络上传输时,统一使用网络字节序,即大端法。这确保了不同主机间数据交换
32k29 分钟

# 应用层 在网络通信的层次结构中,应用层起着核心作用,它提供了用户与网络服务交互的平台。开发者可以依据具体的应用需求,实现定制化的逻辑和功能,使得网络服务在隐藏了底层复杂性的同时,能够灵活适应多样化的应用场景。 应用层包含了多种高级网络通信协议,如 HTTP 协议用于网页浏览、SMTP 协议用于电子邮件的发送、FTP 协议用于文件的传输等。这些协议确立了数据交换的标准格式和交互规则,促进了不同系统和程序之间的无缝通信。在众多协议中,HTTP 协议因其在 Web 开发中的广泛应用而尤为关键,它定义了客户端与服务器之间请求和响应的通信机制。 # HTTP 的概述 在 1989 年,瑞士 CERN
31k29 分钟

# 线程的同步和互斥 在多线程编程中,共享资源的使用是提高程序运行效率的关键,但同时也带来了一系列挑战。由于线程间缺乏隔离机制,共享同一内存地址的操作可能导致所谓的 “竞争条件”,这是指多个线程同时访问并试图修改同一资源时可能发生的问题。这种情况会导致程序的执行结果与预期出现显著偏差。 例如,在以下代码示例中,两个线程被设计为对一个共享变量进行递增操作,每个线程执行一百万次。然而,实际执行结果往往与预期的两百万次递增不符。 #include <pthread.h>#define TIMES 1000000int global = 0;void *increment(voi
32k29 分钟

# 线程概述 # 从进程到线程 在计算机系统中,多进程设计允许用户在同一台计算机上同时处理多个独立的工作任务。操作系统负责管理这些进程,通过调度算法合理地在它们之间分配 CPU 资源、内存、文件等资源。使用多进程设计不仅可以提高单个应用的吞吐量和响应时间,还可以在某个进程因死循环或等待 IO 操作而无法完成任务时,由操作系统调度其他进程来完成任务或响应用户请求。 例如,在文本处理程序中,可以并发地处理用户输入和保存已完成的文件任务。然而,随着进程数量的增加,系统在切换不同进程时会消耗更多的时间。这是因为进程执行过程中,CPU 寄存器中需要保存一些必要的信息,如堆栈、代码段等,这些状态被称为上下