本章主要介绍与对象的“生命周期”有关的技术:我们如何创建对象、如何拷贝对象、如何移动对象以及在对象销毁时如何进行清理工作? 构造函数和析构函数 构造函数与不变式 与类同名的成员称为构造函数(constructor)。构造函数的声明指出其参数列表(与一个函数的参数列表完全一样),但未指出返回类型。 构造函数的任务是初始化该类的一个对象。一般而言,初始…
类基础 类的简要概括: 一个类就是一个用户自定义类型。 一个类由一组成员构成,最常见的成员类别是数据成员和成员函数。 成员函数可以定义初始化(创建)、拷贝、移动和清理(析构)等语义。 对对象使用 .(点)访问成员,对指针使用 ->(箭头)访问成员。 可以为类定义运算符,如 +、! 和 &。 一个类就是一个包含其成员的名字空间…
分离编译 分离编译是一种将程序分解为多个逻辑上独立的部分(如模块或文件)的方法,这样做可以更好地管理程序的组成部分。在 C++ 中,每个源代码文件通常包含一个或多个逻辑组件,而物理结构则是这些逻辑组件在文件系统中的组织方式。 当源文件提交给编译器后,首先进行预处理,处理宏和包含头文件。预处理的结果是编译单元(translation unit),这是…
C++ 通过函数、类和名字空间等语言特性的组合以及源码的组织来实现模块化。 名字空间 名字空间(namespace)是 C++ 中用于组织代码和避免名字冲突的一种机制。它允许将一组相关的特性(如类、函数等)封装在一个命名的作用域内。名字空间的成员可以直接相互访问,而从外部访问它们则需要显式指定名字空间。 名字空间形成了一个具名的作用域。在名字空间内…
错误处理 异常处理是程序设计中用于处理错误的关键机制,它允许程序在遇到错误时,将错误信息从检测点传递到处理点。异常处理主要依赖于两个核心概念:异常安全保障和资源获取即初始化(RAII)。异常安全保障确保程序能够从运行时错误中快速恢复,而 RAII 技术则通过构造函数和析构函数管理资源,确保资源的正确分配和释放。 异常 异常是一个被程序抛出的对象,代…
函数声明 函数声明是告诉编译器函数的存在及其特性的过程。它包括函数的名称、返回值类型(如果有的话)以及参数的数量和类型。函数声明使得在程序的其他部分可以调用该函数,即使函数的定义在声明之后。 在函数声明中包含参数名称有助于理解函数的含义,但这些名称在声明中对编译器来说是可选的,除非声明同时也是函数的定义。 当函数声明的返回类型为 void 时,表…
自由存储 单个对象的分配和释放 int* ptr = new int; // 分配一个int类型的内存空间,并初始化为0 *ptr = 10; // 赋值 delete ptr; // 释放内存 数组的分配和释放 int* arr = new int[10]; // 分配一个int类型数组,包含10个元素 for (int i = 0; i <…
桌面计算器程序 我们的桌面计算器程序提供了四种标准算术操作,它们以中缀运算符的形式出现,可以作用于浮点数。此外,用户还可以定义变量。例如,给定输入: r=2.5 area=pi*r*r (预先定义了 pi)计算器程序将会输出: 2.5 19.635 其中,2.5 是第一行输入的结果,19.635 是第二行的结果。 计算器包含四个部分:分析器…
语句概述 这里是 C++ 语句的形式化定义: 语句: 声明 表达式可选; { 语句列表可选 } try { 语句列表可选 } 处理模块列表 case 常量表达式 : 语句 default : 语句 break; continue; return 表达式可选; goto 标识符; 标识符 : 语句 选择语句 循环语句 选择语句: if( 条件 ) 语…
引言 struct(结构)是由任意类型元素(即成员,member)构成的序列。 union 是一种 struct,同一时刻只保存一个元素的值。 enum(枚举)是包含一组命名常量(称为枚举值)的类型。 enum class(限定作用域的枚举类型)是一种 enum,枚举值位于枚举类型的作用域内,不存在向其他类型的隐式类型转换。 …