Silent-Sure

姑妄言之,姑妄听之

0%

面向对象程序设计期末速通

考试时间:2026.06.17 10:30 ~ 12:30
开始复习时间:2026.06.16 17:00
七小时能速通成功吗?

考前必看

  • 整型提升及其他隐式转换
  • 优先级
  • 重载决议规则

4.3 变量的局部性

  • 局部变量:在复合语句中定义的变量,只能在定义它们的复合语句中使用。
  • 全局变量:在函数外部定义的变量,一般能被程序中的所有函数访问。
  • 变量定义与变量声明的区别
    1. 变量定义会为变量分配空间,变量声明不会。
    2. 变量定义会给变量赋初值,变量声明不会。
    3. 在整个程序中,一个变量的定义只能有一个,而一个变量的声明可以有多个。
  • 生存期:变量在程序运行时占有内存空间的时间段。
  • 不同类型的生存期
    • 静态生存期:内存空间从程序开始执行时就进行分配,直到程序结束时才收回分配给它们的内存空间。
    • 自动生存期:内存空间在程序执行到定义它们的复合语句时才分配,当该复合语句执行结束时,分配的内存空间被收回。
    • 动态生存期:内存空间需要在程序中通过 newmalloc() 来分配并用 deletefree() 来收回。
  • static 局部变量的特点:其值在函数的多次调用之间能够保留。
  • 内存的四个区
    • 静态数据区:用于全局变量、static 局部变量和某些常量的内存分配。
    • 代码区:存放函数的代码。
    • 栈区:用于非 static 局部变量、函数参数和函数调用相关信息的内存分配。
    • 堆区:用于动态变量的内存分配。

4.4 程序的多模块结构

  • 模块:对程序的逻辑单位进行分组的设计理念。一个模块由一组相关的程序实体的定义构成。
  • 内聚性:模块内部各个实体之间的关联程度。
  • 耦合度:各个模块之间的依赖程度。
  • 模块接口:模块的一部分,给出在本模块中定义的、提供给其他模块使用的程序实体的定义和声明。
  • 模块实现:模块的一部分,给出模块中所有程序实体的定义。
  • 作用域:一个标识符所标识的程序实体在程序中能被访问的代码段。
  • 局部作用域:局部常量名、局部变量名以及函数的形参名所具有的作用域,其范围为复合语句中从标识符的定义点开始到复合语句结束之间。
  • 全局作用域:全局变量名、函数名和全局类名一般具有的作用域,其范围为程序的所有模块。
  • 文件作用域:声明时加上了 static 修饰符的全局标识符以及代表常量或内联函数的全局标识符所具有的作用域,其范围为当前文件。
    • 注意这并不使一些 extern 不再必要。
  • 函数作用域:语句标号所具有的作用域,其范围为当前函数的整个函数体。
  • 函数原型作用域:函数形参所具有的作用域,其范围为当前声明的函数原型。
  • 名字空间:C++ 中为避免名字冲突而提供的一种作用域。在名字空间中定义的全局标识符,其作用域为该名字空间;在名字空间外部需要使用该名字空间中定义的全局标识符时,需要用该名字空间的名字和域解析符 :: 进行修饰。

4.6 C++ 函数的进一步讨论

  • 内联函数:定义时以 inline 修饰的函数;该修饰符建议编译程序把函数体展开到调用点。
  • 函数重载:C++ 提供的一种机制:允许在一个作用域中给不同的函数取相同的名字,它们应有不同的参数。
    • 一般用于功能相同而参数不同的函数的定义。

5.1 枚举类型

  • 枚举类型:C++ 中一种由用户自定义的简单数据类型。
    • 定义格式:enum <枚举类型名> {<枚举值表>};
    • 整型到枚举类型没有隐式转换。
    • 但枚举类型值可进行算术运算,运算结果为整型;也可进行比较运算。

5.3 结构类型

  • 结构类型:C++ 中的一种用户自定义类型,表示由固定多个类型可以不同的元素所构成的复合数据。
    • 定义格式:struct <结构类型名> {<成员表>};

5.5 指针类型

  • 指针类型:C++ 中表示内存地址的类型。
  • const 指针:无法通过它修改指向的对象的指针。
    • const 指针到和它指向同一个类型的非 const 指针没有隐式转换,但可以强制转换。
  • 动态变量:在程序运行时由程序根据需要从堆区申请内存而创建的变量。
  • 创建动态变量的三种方式
    1. new <类型名>
    2. new <类型名>[<整型表达式>]
    3. (int*)std::malloc(size)
  • 撤销动态变量的三种方式
    1. delete <指针变量>
    2. delete[] <指针变量>
    3. free(p)
  • new 会调用构造函数,malloc() 不会;delete 会调用析构函数,free() 不会。
  • 悬浮指针:指向一个无效空间的指针。
  • 内存泄漏:一个对象仍在占用内存空间但不再能够访问的现象。

5.6 引用类型

  • 引用类型:C++ 中用来给已有的对象取别名的类型。
  • const 引用:无法通过它修改被引用的对象的引用。
    • const 引用到和它引用同一个类型的非 const 引用没有隐式转换,但可以强制转换。

6.1 数据抽象概述

  • 对象:对象是由数据及能对其实施的操作所构成的封装体。
  • 类:描述一组相同特征的对象的类型。
  • 继承:OOP 中代码复用的重要机制,即定义类时先把已有类的一些特征描述包含进来再定义新的特征。
  • 多态:OOP 的重要概念,包含对象类型的多态、对象标识的多态、消息的多态、重载、泛型等机制。
    • 对象类型的多态:子类对象既属于子类,也属于父类。
    • 对象标识的多态:父类的引用/指针可引用/指向子类对象。
    • 消息的多态:父类和子类对同一个消息有不同的解释。
  • 绑定:确定对多态元素的某个使用是多态元素的哪一种形式的过程。
    • 静态/前期绑定:编译时刻进行的绑定。
    • 动态/后期/延迟绑定:运行时的绑定。

6.2 类

  • 类:C++ 的一种用户自定义类型,用来进行 OOP。
    • 定义格式:class <类名> {<成员描述};
    • 成员包括数据成员和成员函数。

6.4 构造函数

  • 构造函数:C++ 中进行对象初始化的特殊成员函数,在创建对象时自动调用。
  • 成员初始化的次序是类定义中的说明次序。
  • 创建包含成员对象的类的对象时,先执行成员对象类的构造函数,再执行本身类的构造函数。
  • 一个类若包含多个成员对象,这些对象的初始化次序按它们在类中的说明次序(而不是成员初始化表的次序)进行。
  • 拷贝构造函数:用同类型的对象对对象进行初始化一种特殊的构造函数,其签名为 A(const A&);
    • 函数签名中的 const 不是必须的。
    • 在三种情况下会调用:
      1. 用同类型的对象对对象进行初始化时。
      2. 将对象作为值参数传给函数时。
      3. 把对象作为值返回时。
      • 系统提供的隐式拷贝构造函数会调用成员对象的拷贝构造函数,但自定义的拷贝构造函数不会调用成员对象的拷贝构造函数。
  • 有时候必须自定义拷贝构造函数,例如当有成员是表示某个对象的指针时。
  • 析构函数:C++ 中进行对象消亡前处理的特殊成员函数,在对象消亡前自动调用。
  • 包含成员对象的类的对象消亡前,先执行本身类的析构函数,再执行成员对象类的析构函数。

6.6 对象与类的进一步讨论

  • const 成员函数:不改变数据成员的成员函数,通过加修饰符 const 声明。
  • const 对象只能调用 const 成员函数。
  • const 成员函数放在类外定义时,函数声明和定义都要加上 const
  • static 数据成员:对类的所有对象只有一个拷贝的数据成员,通过加 static 修饰符声明。
    • 在类内声明但在类外部初始化(初始化时不加 static 修饰符);但类型为整型和枚举型时,可在类内初始化。
    • 可通过对象名或类名访问。
  • static 成员函数:只能访问 static 成员且不能访问 this 指针的成员函数,通过加 static 修饰符声明。
    • 可通过对象名或类名访问。
  • 友元:类中被指定为可访问该类的私有或保护成员的程序实体(全局函数、类或类的成员函数)。
    • 声明格式:friend <该实体的声明>

6.7 运算符重载

  • 运算符重载的两种方式:以成员函数形式重载、以全局(通常是友元)函数形式重载。
  • 不能重载的运算符:..*? :::sizeof
  • 注意运算符的返回值何时应为引用。
  • ++-- 的后置用法设置专门的重载:const A operator++(int) { ... }
  • C++ 的隐式赋值运算符会调用成员对象的赋值运算符重载函数。
  • 有时候必须重载赋值运算符。
  • 类成员访问操作符 -> 的重载:返回值是当前类的指针。重载后,a->f() 相当于 a.operator->()->f()
  • 如果两个类型可以互相转换,在隐式转换时会有歧义。此时需要把某个构造函数声明为 explicit,禁止将其用于隐式转换。

7.2 单继承

  • 继承方式:private 成员永远变成隐藏成员;其他成员的访问控制变为其原来的访问控制与继承方式的字面意思之间更受限的那个。
    • 访问控制符的调整:<访问控制符>: <基类名>::<基类成员名列表>;
  • 定义派生类时基类必须完全。
  • 友元关系不继承。
  • 在派生类中访问基类的同名成员,要加基类名受限符;即使是同名但参数不同的成员函数也是如此。
  • 如果一个类 D 既有基类 B、又有成员对象类 M,则
    • 在创建 D 类对象时,构造函数的执行次序为 B、M、D。
    • 当 D 类的对象消亡时,析构函数的执行次序为 D、M、B。
  • 派生类的隐式拷贝构造函数会调用基类的拷贝构造函数;派生类自定义拷贝构造函数在默认情况下则调用基类的默认构造函数。
  • 派生类的隐式赋值操作符会调用基类的赋值操作符。

7.3 消息的动态绑定

  • 虚函数:C++ 中用来实现消息的动态绑定的机制。如果基类中的一个成员函数如果被定义成虚函数,则在派生类中定义的、与之具有相同型构的成员函数会覆盖该成员函数。
  • 只要在基类中说明了虚函数,在派生类、派生类的派生类……中,同型构的成员函数自动称为虚函数。
  • 构造函数和析构函数对虚函数的调用不进行动态绑定。
  • 纯虚函数:只给出函数声明、不给出实现的虚函数。
    • 包含纯虚函数的类称为抽象类,不可用于创建对象。

7.4 多继承

  • 多继承声明中基类的声明次序决定:
    • 基类构造函数、析构函数的调用次序。
    • 对基类数据成员的存储安排。
  • 多继承可能出现名冲突。解决办法是采用基类名修饰的访问。
  • 解决重复继承:虚基类。
  • 包含虚基类的类,虚基类的构造函数由最新派生出的类的构造函数直接调用,且优先于非虚基类的构造函数执行。

10.1 泛型

  • 泛性:一个程序实体能对多种类型的数据进行操作或描述的特性。
  • 泛型程序设计:基于具有泛性的程序实体进行程序设计的技术。
  • 模板:一段程序代码,它带有类型参数,在程序中可以通过给这些参数提供一些类型来得到针对不同类型的具体代码。

10.3 迭代器

  • 迭代器的类型
    • 输出迭代器
    • 输入迭代器
    • 前向迭代器
    • 双向迭代器
    • 随机访问迭代器

8 输入输出

随便看看得了。

9 异常处理

随便看看得了。

考后记

两道编程题来不及写,哈哈。估分 80,应该是无缘 4.0 了。