《C++面向对象程序设计(甲)》期末试卷B (精选01)

大学生期末考试复习平台前往平台

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:答案直接写在答题纸上,答在试卷上无效,考试后答题纸和试卷一同上交

一、单项选择题(每题 2 分,总计 20 分)

  1. 面向对象程序设计中的数据隐藏指的是 ( )
    • A. 输入数据必须输入保密口令
    • B. 数据经过加密处理
    • C. 对象内部数据和代码合并在一起
    • D. 对象内部数据结构的不可访问性

::::: details 查看答案与解析

答案:D

解析:
本题考查面向对象程序设计中的数据隐藏概念。

第一步:理解数据隐藏的含义
数据隐藏是面向对象程序设计的基本特征之一,指的是对象内部的数据结构(私有成员)对外部是不可见的,外部只能通过对象提供的公有接口(成员函数)来访问和操作数据。

第二步:逐一分析选项

  • A 选项:输入数据必须输入保密口令——这是安全性措施,不是数据隐藏的核心含义。
  • B 选项:数据经过加密处理——加密是数据安全技术,与面向对象的数据隐藏无关。
  • C 选项:对象内部数据和代码合并在一起——这描述的是封装的概念,但不准确。封装是将数据和操作数据的方法绑定在一起,而数据隐藏强调的是"不可访问性"。
  • D 选项:对象内部数据结构的不可访问性——正确,这正是数据隐藏的核心:外部不能直接访问对象的内部数据,只能通过公有接口间接访问。

方法总结:数据隐藏 = 私有成员对外不可见 + 通过公有接口访问。


难度: ⭐
考点: #数据隐藏 #面向对象基本特征 #封装

:::: details 💡 学习锦囊
📖 相关公式与知识点:

  • 面向对象的三大基本特征:封装、继承、多态
  • 封装 = 数据隐藏 + 公有接口
  • 数据隐藏通过 privateprotected 访问控制实现
  • 公有接口通过 public 成员函数提供

::: tip 思路分析
数据隐藏的关键词是"不可访问性"——外部代码不能直接读写对象的私有数据成员,必须通过类提供的公有方法。
:::

::: warning 易错点

  • 容易将"数据隐藏"与"加密"混淆——加密是安全技术,数据隐藏是设计原则
  • 容易将"封装"等同于"数据隐藏"——封装包含数据隐藏,但范围更广
    :::
    ::::

:::: details 🔄 举一反三

  1. 下列关于封装的描述中,正确的是 ( )
    • A. 封装就是将所有数据成员都设为 private
    • B. 封装是将数据和操作数据的方法绑定在一起,并隐藏内部实现细节
    • C. 封装要求所有成员函数都必须是 public 的
    • D. 封装就是数据隐藏
      ::: details 查看练习答案与解析
      答案:B
      解析:封装是将数据(属性)和操作数据的方法(行为)绑定在一起形成一个类,同时隐藏内部实现细节,只暴露必要的接口。A 错误因为封装不一定所有数据都是 private;C 错误因为成员函数可以是 private 或 protected;D 错误因为数据隐藏只是封装的一部分。
      :::
      ::::

:::::

  1. 一个内联函数 Fun,使用 int 类型的参数,求其平方并返回,返回值也为 int 类型,下列定义正确的是 ( )
    • A. int Fun(int x){return x*x;}
    • B. inline int Fun(int x){return x*x;}
    • C. int Fun inline(int x){return x*x;}
    • D. int Fun(int x){inline return x*x;}

::::: details 查看答案与解析

答案:B

解析:
本题考查内联函数的定义语法。

第一步:回顾内联函数的定义方式
内联函数使用关键字 inline 来声明,语法格式为:

inline 返回值类型 函数名(参数列表) { 函数体 }

第二步:逐一分析选项

  • A 选项:int Fun(int x){return x*x;}——没有 inline 关键字,只是普通函数定义。
  • B 选项:inline int Fun(int x){return x*x;}——正确,inline 在返回值类型之前,符合标准语法。
  • C 选项:int Fun inline(int x){return x*x;}——inline 放在函数名和参数列表之间,语法错误。
  • D 选项:int Fun(int x){inline return x*x;}——inline 放在函数体内部,语法错误。

第三步:内联函数的工作原理
内联函数在编译时会在调用处展开函数体代码,避免了函数调用的开销(参数压栈、跳转等),适用于短小、频繁调用的函数。


难度: ⭐
考点: #内联函数 #inline关键字 #函数定义语法

:::: details 💡 学习锦囊
📖 相关公式与知识点:

  • 内联函数定义:inline 返回类型 函数名(参数) { 函数体 }
  • 内联函数适用于短小(通常 1-5 行)、频繁调用的函数
  • 类体内定义的成员函数自动成为内联函数
  • inline 是对编译器的建议,编译器可能忽略

::: tip 思路分析
记住 inline 关键字的正确位置:在返回值类型之前,即 inline int Fun(...)
:::

::: warning 易错点

  • inline 放在函数体内部(如 D 选项)
  • 认为类外定义的成员函数加 inline 也必须放在类声明中——实际上在类外定义时加 inline 也可以
    :::
    ::::

:::: details 🔄 举一反三

  1. 下列关于内联函数的描述中,错误的是 ( )
    • A. 内联函数在编译时进行代码展开
    • B. 内联函数可以减少函数调用的开销
    • C. 所有函数都应该定义为内联函数以提高效率
    • D. 递归函数通常不适合定义为内联函数
      ::: details 查看练习答案与解析
      答案:C
      解析:内联函数会导致代码膨胀(每个调用点都展开一份代码),因此只适合短小函数。如果所有函数都定义为内联函数,可执行文件会变得非常大,反而降低效率。递归函数无法在编译时确定展开次数,不适合内联。
      :::
      ::::

:::::

  1. 下面关于重载函数的叙述中正确的是 ( )
    • A. 重载函数必须具有不同的返回值类型
    • B. 重载函数的形参个数必须不同
    • C. 重载函数必须有不同的形参列表
    • D. 重载函数的函数名可以不同

::::: details 查看答案与解析

答案:C

解析:
本题考查函数重载的判定条件。

第一步:回顾函数重载的定义
函数重载是指在同一个作用域内,多个函数具有相同的函数名,但形参列表(参数个数、类型或顺序)不同。

第二步:逐一分析选项

  • A 选项:重载函数必须具有不同的返回值类型——错误。返回值类型不能作为重载的区分条件,因为调用函数时可以不使用返回值。
  • B 选项:重载函数的形参个数必须不同——错误。形参个数可以相同,只要类型或顺序不同即可。例如 void f(int)void f(double) 参数个数相同但类型不同,构成重载。
  • C 选项:重载函数必须有不同的形参列表——正确。这是重载的核心条件。
  • D 选项:重载函数的函数名可以不同——错误。重载的前提是函数名相同。

第三步:重载的判定规则
编译器根据函数调用时实参的类型和数量,匹配对应的重载版本。仅返回值类型不同不构成重载。


难度: ⭐
考点: #函数重载 #形参列表 #重载判定条件

:::: details 💡 学习锦囊
📖 相关公式与知识点:

  • 重载条件:函数名相同 + 形参列表不同(个数/类型/顺序)
  • 返回值类型不能区分重载
  • 形参的 const 修饰可以区分重载(如 void f(int&)void f(const int&)
  • 重载解析:编译器根据实参匹配最佳重载版本

::: tip 思路分析
记住口诀:“同名不同参”——函数名相同,参数列表不同。
:::

::: warning 易错点

  • 认为返回值类型不同就可以重载——这是最常见的错误
  • 忘记 const 成员函数也可以构成重载
    :::
    ::::

:::: details 🔄 举一反三

  1. 下列函数中,能与 void f(int a) 构成重载的是 ( )
    • A. int f(int a)
    • B. void f(int a, int b)
    • C. void g(int a)
    • D. int f(double a)
      ::: details 查看练习答案与解析
      答案:B 和 D
      解析:B 参数个数不同(1 个 vs 2 个),构成重载;D 参数类型不同(int vs double),构成重载。A 仅返回值类型不同,不构成重载;C 函数名不同(g vs f),不构成重载。
      :::
      ::::

:::::

  1. 下列关于纯虚函数的描述中,错误的是 ( )
    • A. 在基类中只有声明,通常没有函数体定义
    • B. 可以使用包含纯虚函数的类来创建对象
    • C. 当需要使用包含纯虚函数的基类的派生类创建对象时,须在派生类中给出该函数定义
    • D. 包含纯虚函数的类称为抽象类

::::: details 查看答案与解析

答案:B

解析:
本题考查纯虚函数和抽象类的概念。

第一步:回顾纯虚函数的定义
纯虚函数是在基类中声明但不实现的虚函数,语法为:virtual 返回类型 函数名(参数) = 0;

第二步:逐一分析选项

  • A 选项:在基类中只有声明,通常没有函数体定义——正确。纯虚函数在基类中通过 =0 声明,通常不提供函数体(但 C++ 允许在类外为纯虚函数提供定义)。
  • B 选项:可以使用包含纯虚函数的类来创建对象——错误。包含纯虚函数的类是抽象类,不能实例化(创建对象)。
  • C 选项:派生类需要给出纯虚函数的定义才能创建对象——正确。派生类必须实现(override)所有纯虚函数,才能成为具体类并创建对象。
  • D 选项:包含纯虚函数的类称为抽象类——正确。

第三步:抽象类的特性
抽象类不能实例化,但可以定义指针和引用,用于实现多态。


难度: ⭐
考点: #纯虚函数 #抽象类 #虚函数

:::: details 💡 学习锦囊
📖 相关公式与知识点:

  • 纯虚函数语法:virtual void func() = 0;
  • 抽象类 = 包含至少一个纯虚函数的类
  • 抽象类不能实例化(不能创建对象)
  • 派生类必须实现所有纯虚函数才能实例化
  • 抽象类可以定义指针和引用

::: tip 思路分析
看到"纯虚函数"→ 想到"=0"→ 想到"抽象类"→ 想到"不能创建对象"。
:::

::: warning 易错点

  • 混淆虚函数和纯虚函数——虚函数有函数体,纯虚函数没有
  • 认为抽象类完全不能使用——实际上可以定义指针/引用
    :::
    ::::

:::: details 🔄 举一反三

  1. 下列关于抽象类的描述中,正确的是 ( )
    • A. 抽象类中不能定义构造函数
    • B. 抽象类不能定义数据成员
    • C. 抽象类可以作为基类被继承
    • D. 抽象类中的所有函数都必须是纯虚函数
      ::: details 查看练习答案与解析
      答案:C
      解析:抽象类可以作为基类被继承,这是它的主要用途——定义接口规范。A 错误,抽象类可以有构造函数(供派生类调用);B 错误,抽象类可以有数据成员;D 错误,抽象类中可以有非纯虚函数(普通成员函数)。
      :::
      ::::

:::::

  1. 下列关于析构函数的描述中正确的是 ( )
    • A. 析构函数可以重载
    • B. 析构函数可以是虚函数
    • C. 析构函数名与类名相同
    • D. 析构函数的返回类型为 void

::::: details 查看答案与解析

答案:B

解析:
本题考查析构函数的特性。

第一步:回顾析构函数的基本特征
析构函数在对象生命周期结束时自动调用,用于释放资源。其特征包括:

  • 函数名:~类名
  • 无返回值类型(连 void 也不写)
  • 无参数,因此不能重载
  • 一个类只有一个析构函数

第二步:逐一分析选项

  • A 选项:析构函数可以重载——错误。析构函数没有参数,无法重载。
  • B 选项:析构函数可以是虚函数——正确。将基类的析构函数声明为虚函数,可以确保通过基类指针删除派生类对象时,正确调用派生类的析构函数。
  • C 选项:析构函数名与类名相同——错误。析构函数名是 ~类名,不是类名本身。
  • D 选项:析构函数的返回类型为 void——错误。析构函数没有返回类型。

第三步:虚析构函数的重要性
当通过基类指针删除派生类对象时,如果析构函数不是虚函数,只会调用基类的析构函数,可能导致派生类资源泄漏。


难度: ⭐
考点: #析构函数 #虚析构函数 #资源管理

:::: details 💡 学习锦囊
📖 相关公式与知识点:

  • 析构函数格式:~类名() { ... }
  • 析构函数无参数、无返回值、不可重载
  • 虚析构函数:virtual ~类名() { ... }
  • 基类析构函数建议声明为虚函数
  • 析构函数调用顺序:先派生类析构,后基类析构

::: tip 思路分析
析构函数的关键特征:~ 开头、无参、无返回值、唯一。虚析构函数是多态正确释放资源的关键。
:::

::: warning 易错点

  • 认为析构函数名与类名相同——实际是 ~类名
  • 忘记将基类析构函数声明为虚函数——导致派生类资源泄漏
    :::
    ::::

:::: details 🔄 举一反三

  1. 下列代码的输出结果是什么?

    class Base {
    public:
        ~Base() { cout << "Base destructor" << endl; }
    };
    class Derived : public Base {
    public:
        ~Derived() { cout << "Derived destructor" << endl; }
    };
    int main() {
        Base* p = new Derived();
        delete p;
        return 0;
    }
    

    ::: details 查看练习答案与解析
    答案:只输出 Base destructor
    解析:因为 Base 的析构函数不是虚函数,通过基类指针 delete 时只调用 Base 的析构函数,Derived 的析构函数不会被调用。将 ~Base() 改为 virtual ~Base() 后,输出为 Derived destructor 然后 Base destructor
    :::
    ::::

:::::

  1. 下列关于纯虚函数的描述中,正确的是 ( )
    • A. 纯虚函数是一种特殊的虚函数,它是个空函数
    • B. 具有纯虚函数的类称为虚基类
    • C. 一个基类中说明有纯虚函数,其派生类一定要实现该纯虚函数
    • D. 具有纯虚函数的类不能创建类对象

::::: details 查看答案与解析

答案:D

解析:
本题考查纯虚函数和抽象类的正确理解。

第一步:逐一分析选项

  • A 选项:纯虚函数是个空函数——错误。纯虚函数是"没有实现"的函数(=0),不是"空函数"(空函数有函数体 {})。
  • B 选项:具有纯虚函数的类称为虚基类——错误。具有纯虚函数的类称为"抽象类";"虚基类"是解决菱形继承问题的概念(virtual 继承)。
  • C 选项:派生类一定要实现该纯虚函数——错误。派生类可以不实现纯虚函数,但此时派生类也是抽象类,不能实例化。
  • D 选项:具有纯虚函数的类不能创建类对象——正确。这是抽象类的核心特性。

第二步:区分关键概念

  • 纯虚函数 ≠ 空函数:virtual void f() = 0;(纯虚函数)vs virtual void f() {}(空实现的虚函数)
  • 抽象类 ≠ 虚基类:抽象类(含纯虚函数)vs 虚基类(virtual 继承的基类)

难度: ⭐
考点: #纯虚函数 #抽象类 #虚基类

:::: details 💡 学习锦囊
📖 相关公式与知识点:

  • 纯虚函数:virtual void f() = 0;——只有声明,没有实现
  • 空函数:virtual void f() {}——有实现,但函数体为空
  • 抽象类:包含纯虚函数的类,不能实例化
  • 虚基类:使用 virtual 继承的基类,解决菱形继承

::: tip 思路分析
区分三个易混淆概念:纯虚函数(=0)、抽象类(含纯虚函数)、虚基类(virtual 继承)。
:::

::: warning 易错点

  • 混淆"抽象类"和"虚基类"——两个完全不同的概念
  • 认为派生类必须实现纯虚函数——可以不实现,但自身也成为抽象类
    :::
    ::::

:::: details 🔄 举一反三

  1. 下列关于虚基类的描述中,正确的是 ( )
    • A. 虚基类就是包含纯虚函数的类
    • B. 虚基类用于解决多重继承中的二义性问题
    • C. 虚基类不能有数据成员
    • D. 虚基类的构造函数不会被调用
      ::: details 查看练习答案与解析
      答案:B
      解析:虚基类(virtual base class)用于解决菱形继承中基类成员的多份拷贝问题。A 错误,包含纯虚函数的是抽象类;C 错误,虚基类可以有数据成员;D 错误,虚基类的构造函数由最派生类负责调用。
      :::
      ::::

:::::

  1. 复制初始化构造函数的作用是 ( )
    • A. 进行数据类型的转换
    • B. 用对象调用成员函数
    • C. 用对象初始化对象
    • D. 用一般类型的数据初始化对象

::::: details 查看答案与解析

答案:C

解析:
本题考查复制(拷贝)构造函数的用途。

第一步:回顾拷贝构造函数的定义
拷贝构造函数是用一个已存在的同类对象来初始化新创建的对象。其典型声明为:

ClassName(const ClassName& other);

第二步:逐一分析选项

  • A 选项:进行数据类型的转换——这是转换构造函数的作用(单参数非拷贝构造函数)。
  • B 选项:用对象调用成员函数——这是普通成员函数调用的作用。
  • C 选项:用对象初始化对象——正确。这正是拷贝构造函数的用途。
  • D 选项:用一般类型的数据初始化对象——这是普通构造函数或转换构造函数的作用。

第三步:拷贝构造函数的调用场景

  1. 用已有对象初始化新对象:ClassName obj2 = obj1;
  2. 函数参数按值传递对象时
  3. 函数返回值为对象时

难度: ⭐
考点: #拷贝构造函数 #对象初始化 #深拷贝与浅拷贝

:::: details 💡 学习锦囊
📖 相关公式与知识点:

  • 拷贝构造函数声明:ClassName(const ClassName& obj);
  • 默认拷贝构造函数执行浅拷贝(逐成员复制)
  • 当类包含指针成员时,需要自定义深拷贝
  • 调用场景:初始化新对象、值传递参数、值返回对象

::: tip 思路分析
拷贝构造函数 = “用同类对象初始化新对象”。关键词是"初始化"(区别于"赋值")。
:::

::: warning 易错点

  • 混淆拷贝构造函数和赋值运算符——拷贝构造是初始化,赋值是已有对象的赋值
  • 忘记 const 引用参数——应该是 const ClassName&
    :::
    ::::

:::: details 🔄 举一反三

  1. 下列哪种情况不会调用拷贝构造函数? ( )
    • A. MyClass obj2 = obj1;
    • B. void func(MyClass obj); 调用 func(obj1);
    • C. obj2 = obj1;(obj2 已存在)
    • D. return obj1;(函数返回值)
      ::: details 查看练习答案与解析
      答案:C
      解析:C 是赋值操作,调用的是赋值运算符 operator=,不是拷贝构造函数。A 是初始化,调用拷贝构造;B 是值传递参数,调用拷贝构造;D 是返回值,调用拷贝构造。
      :::
      ::::

:::::

  1. 所谓多态性是指 ( )
    • A. 不同的对象调用不同名称的函数
    • B. 不同的对象调用相同名称的函数
    • C. 一个对象调用不同名称的函数
    • D. 一个对象调用不同名称的对象

::::: details 查看答案与解析

答案:B

解析:
本题考查面向对象中多态性的概念。

第一步:理解多态的含义
多态(Polymorphism)指的是同一个接口(函数名),不同的对象调用时表现出不同的行为。即"一个接口,多种实现"。

第二步:逐一分析选项

  • A 选项:不同对象调用不同名称的函数——这只是普通的函数调用,不是多态。
  • B 选项:不同的对象调用相同名称的函数——正确。通过虚函数机制,基类指针/引用调用同名函数时,根据实际对象类型执行不同的函数版本。
  • C 选项:一个对象调用不同名称的函数——普通成员函数调用。
  • D 选项:一个对象调用不同名称的对象——语法不通。

第三步:多态的两种形式

  • 编译时多态(静态多态):函数重载、运算符重载、模板
  • 运行时多态(动态多态):虚函数 + 基类指针/引用

难度: ⭐
考点: #多态性 #虚函数 #动态绑定

:::: details 💡 学习锦囊
📖 相关公式与知识点:

  • 多态 = 同一接口,不同实现
  • 静态多态:函数重载、模板(编译时确定)
  • 动态多态:虚函数 + 基类指针/引用(运行时确定)
  • 动态多态三要素:继承、虚函数、基类指针/引用

::: tip 思路分析
多态的核心:“同名函数,不同行为”。通过基类指针调用虚函数时,实际执行的是派生类的版本。
:::

::: warning 易错点

  • 认为函数重载就是多态的全部——重载只是静态多态
  • 忘记多态需要基类指针/引用——直接通过对象调用不会触发多态
    :::
    ::::

:::: details 🔄 举一反三

  1. 下列代码的输出结果是什么?

    class Base {
    public:
        virtual void show() { cout << "Base" << endl; }
    };
    class Derived : public Base {
    public:
        void show() { cout << "Derived" << endl; }
    };
    int main() {
        Base b; Derived d;
        Base* p = &b; p->show();
        p = &d; p->show();
        return 0;
    }
    

    ::: details 查看练习答案与解析
    答案:先输出 Base,再输出 Derived
    解析show() 是虚函数,通过基类指针调用时发生动态绑定。p 指向 b 时调用 Base::show(),指向 d 时调用 Derived::show()。这就是运行时多态。
    :::
    ::::

:::::

  1. 要将类 A 说明是类 B 的虚基类,正确的描述是 ( )
    • A. class virtual B : public A
    • B. class B : virtual public A
    • C. virtual class B : public A
    • D. class B : public A virtual

::::: details 查看答案与解析

答案:B

解析:
本题考查虚基类的声明语法。

第一步:回顾虚基类的语法
虚继承使用 virtual 关键字,放在继承方式之前:

class 派生类 : virtual 继承方式 基类 { ... };

第二步:逐一分析选项

  • A 选项:class virtual B : public A——virtual 位置错误,不能放在 class 关键字之后。
  • B 选项:class B : virtual public A——正确。virtual 在继承方式 public 之前。
  • C 选项:virtual class B : public A——virtual 位置错误。
  • D 选项:class B : public A virtual——virtual 位置错误,不能放在最后。

第三步:虚基类的作用
虚基类用于解决菱形继承(钻石继承)问题,确保最终派生类中只有一份基类成员的拷贝。


难度: ⭐
考点: #虚基类 #虚继承 #菱形继承

:::: details 💡 学习锦囊
📖 相关公式与知识点:

  • 虚继承语法:class B : virtual public A { };
  • 虚基类解决菱形继承中的二义性和数据冗余
  • 虚基类的构造函数由最派生类负责调用
  • virtual 关键字在继承方式之前

::: tip 思路分析
记住语法格式:class 派生类 : virtual 继承方式 基类virtual 在继承方式前面。
:::

::: warning 易错点

  • virtual 的位置放错——必须在继承方式之前
  • 混淆虚基类和抽象类——虚基类用 virtual 继承,抽象类含纯虚函数
    :::
    ::::

:::: details 🔄 举一反三

  1. 在菱形继承结构中,如果不使用虚基类,最终派生类中会包含几份基类成员的拷贝? ( )
    • A. 1 份
    • B. 2 份
    • C. 3 份
    • D. 4 份
      ::: details 查看练习答案与解析
      答案:B
      解析:在典型的菱形继承中(B 和 C 都继承 A,D 同时继承 B 和 C),如果不使用虚基类,D 中会包含 2 份 A 的成员拷贝(分别来自 B 和 C 路径)。使用虚基类后,D 中只有 1 份 A 的成员拷贝。
      :::
      ::::

:::::

  1. 标准模板库(STL)所涉及的 4 个最主要的基本组件是 ( )
    • A. 容器、迭代器、算法、函数模板
    • B. 类模板、运算符重载函数、容器、算法
    • C. 容器、算法、迭代器、函数对象
    • D. 类、对象、迭代器、函数

::::: details 查看答案与解析

答案:C

解析:
本题考查 STL(Standard Template Library)的核心组件。

第一步:回顾 STL 的四大组件
STL 由以下四个核心组件构成:

  1. 容器(Containers):存储数据的模板类,如 vectorlistmap
  2. 算法(Algorithms):操作数据的模板函数,如 sortfindcopy
  3. 迭代器(Iterators):连接容器和算法的"胶水",提供遍历容器的方法
  4. 函数对象(Functors):重载了 operator() 的类对象,可作为算法的策略参数

第二步:逐一分析选项

  • A 选项:将"函数对象"误写为"函数模板"——错误。
  • B 选项:类模板和运算符重载不是 STL 的核心组件——错误。
  • C 选项:容器、算法、迭代器、函数对象——正确。
  • D 选项:类、对象是面向对象的基本概念,不是 STL 组件——错误。

难度: ⭐
考点: #STL #标准模板库 #容器 #迭代器 #算法

:::: details 💡 学习锦囊
📖 相关公式与知识点:

  • STL 四大组件:容器、算法、迭代器、函数对象
  • 常用容器:vector(动态数组)、list(双向链表)、map(键值对)、set(集合)
  • 常用算法:sortfindfor_eachcopy
  • 迭代器类型:输入、输出、前向、双向、随机访问
  • 函数对象:重载 operator() 的类

::: tip 思路分析
STL = 容器(存数据)+ 算法(处理数据)+ 迭代器(遍历数据)+ 函数对象(定制行为)。
:::

::: warning 易错点

  • 将"函数对象"记成"函数模板"——函数模板是泛型编程的基础,但不是 STL 四大组件之一
  • 忘记迭代器是独立组件——迭代器是容器和算法之间的桥梁
    :::
    ::::

:::: details 🔄 举一反三

  1. 下列关于 STL 容器的描述中,错误的是 ( )
    • A. vector 支持随机访问
    • B. list 支持随机访问
    • C. map 存储键值对
    • D. set 中的元素自动排序
      ::: details 查看练习答案与解析
      答案:B
      解析list 是双向链表,不支持随机访问(不能使用 [] 运算符),只能通过迭代器顺序访问。vector 是动态数组,支持随机访问;map 存储键值对并按键自动排序;set 存储唯一元素并自动排序。
      :::
      ::::

:::::

更多推荐