11k10 分钟

# 移动语义(Move Semantics) 在 C++ 11 之前,当对象作为函数参数传递,或者从函数返回,或者作为复制构造函数的参数时,经常会造成不必要的性能开销,因为这些操作会进行对象的拷贝,包括其资源的拷贝(如动态分配的内存)。为了解决这个问题,C++ 11 引入了移动语义。 为什么要用移动语义? 移动语义 的核心思想是,当一个临时对象提供了右值引用时,可以将其内部资源 “移动” 到新的对象中,而不是进行复制。这样,新对象可以重用临时对象的资源,而临时对象在移动后会处于有效但未定义的状态。 好处: 性能提升:避免了不必要的资源复制,减少了性能开销。 资源利用:可以重用临时对象的资源,
18k16 分钟

C++ 作为一种静态类型、编译型语言,需要在编译时确定所有类型。为了在保持类型安全的同时提供灵活性,C++ 引入了模板机制,使得我们能够编写泛型代码。 模板是一种将数据类型作为参数传递给函数或类的通用机制。通过使用模板,我们可以编写与类型无关的代码,这些代码在编译时会针对特定的数据类型进行实例化。 # 为什么要定义模板 在静态类型语言中,变量的类型在编译时必须已知,这有助于编译器进行类型检查和优化。然而,这也意味着我们需要为每种类型编写特定的函数或类,这增加了代码的冗余和维护的复杂性。 与静态类型语言相对的是动态类型语言,如 Python 和 JavaScript,它们在运行时确定变量的类型。
28k25 分钟

# 多态 多态是面向对象编程的核心特征之一,它允许以统一的接口处理不同类型的对象。 # 什么是多态? 多态 允许不同的类的对象对同一消息做出不同的响应。简单来说,就是同一个函数或方法在不同的对象中可以有不同的实现。这样,当我们调用一个对象的方法时,无需知道对象的具体类型,就可以执行相应的行为。 # 为什么需要多态性? 多态性 带来以下好处: 代码复用:通过继承和接口实现代码的复用。 解耦:多态可以降低类之间的耦合度,提高代码的可维护性。 扩展性:多态使得在不修改现有代码的情况下,可以轻松添加新的类。 灵活性:多态提供了更高的灵活性,使得同一个操作可以应用于不同的对象。 # C++ 中的多态
26k24 分钟

# 继承 # 继承的基本概念 在 C++ 中,继承是一种重要的面向对象编程特性,它允许我们建立类之间的层次关系,实现代码的重用和扩展。 继承的概念: 基类(父类):被继承的类称为基类,它定义了可以被其他类继承的属性和方法。 派生类(子类):从基类继承而来的类称为派生类,它继承了基类的属性和方法,并可以添加自己的属性和方法。 在派生类的定义中,需要在类名前指定继承方式和基类名。 class 基类 { // ...};class 派生类 : public 基类 { // ...};C++ 支持三种继承方
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 方法来处理。 在编程语言中,程序的输入指的是将数据从外部来源
63k57 分钟

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

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

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