《C++面向对象程序设计(甲)》期末试卷B (精选01)
《C++面向对象程序设计(甲)》期末试卷B (精选01)
大学生期末考试复习平台前往平台





注意:答案直接写在答题纸上,答在试卷上无效,考试后答题纸和试卷一同上交
一、单项选择题(每题 2 分,总计 20 分)
- 面向对象程序设计中的数据隐藏指的是 ( )
- A. 输入数据必须输入保密口令
- B. 数据经过加密处理
- C. 对象内部数据和代码合并在一起
- D. 对象内部数据结构的不可访问性
::::: details 查看答案与解析
答案:D
解析:
本题考查面向对象程序设计中的数据隐藏概念。
第一步:理解数据隐藏的含义
数据隐藏是面向对象程序设计的基本特征之一,指的是对象内部的数据结构(私有成员)对外部是不可见的,外部只能通过对象提供的公有接口(成员函数)来访问和操作数据。
第二步:逐一分析选项
- A 选项:输入数据必须输入保密口令——这是安全性措施,不是数据隐藏的核心含义。
- B 选项:数据经过加密处理——加密是数据安全技术,与面向对象的数据隐藏无关。
- C 选项:对象内部数据和代码合并在一起——这描述的是封装的概念,但不准确。封装是将数据和操作数据的方法绑定在一起,而数据隐藏强调的是"不可访问性"。
- D 选项:对象内部数据结构的不可访问性——正确,这正是数据隐藏的核心:外部不能直接访问对象的内部数据,只能通过公有接口间接访问。
方法总结:数据隐藏 = 私有成员对外不可见 + 通过公有接口访问。
难度: ⭐
考点: #数据隐藏 #面向对象基本特征 #封装
:::: details 💡 学习锦囊
📖 相关公式与知识点:
- 面向对象的三大基本特征:封装、继承、多态
- 封装 = 数据隐藏 + 公有接口
- 数据隐藏通过
private和protected访问控制实现 - 公有接口通过
public成员函数提供
::: tip 思路分析
数据隐藏的关键词是"不可访问性"——外部代码不能直接读写对象的私有数据成员,必须通过类提供的公有方法。
:::
::: warning 易错点
- 容易将"数据隐藏"与"加密"混淆——加密是安全技术,数据隐藏是设计原则
- 容易将"封装"等同于"数据隐藏"——封装包含数据隐藏,但范围更广
:::
::::
:::: details 🔄 举一反三
- 下列关于封装的描述中,正确的是 ( )
- A. 封装就是将所有数据成员都设为 private
- B. 封装是将数据和操作数据的方法绑定在一起,并隐藏内部实现细节
- C. 封装要求所有成员函数都必须是 public 的
- D. 封装就是数据隐藏
::: details 查看练习答案与解析
答案:B
解析:封装是将数据(属性)和操作数据的方法(行为)绑定在一起形成一个类,同时隐藏内部实现细节,只暴露必要的接口。A 错误因为封装不一定所有数据都是 private;C 错误因为成员函数可以是 private 或 protected;D 错误因为数据隐藏只是封装的一部分。
:::
::::
:::::
- 一个内联函数 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;}
- A.
::::: 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 🔄 举一反三
- 下列关于内联函数的描述中,错误的是 ( )
- A. 内联函数在编译时进行代码展开
- B. 内联函数可以减少函数调用的开销
- C. 所有函数都应该定义为内联函数以提高效率
- D. 递归函数通常不适合定义为内联函数
::: details 查看练习答案与解析
答案:C
解析:内联函数会导致代码膨胀(每个调用点都展开一份代码),因此只适合短小函数。如果所有函数都定义为内联函数,可执行文件会变得非常大,反而降低效率。递归函数无法在编译时确定展开次数,不适合内联。
:::
::::
:::::
- 下面关于重载函数的叙述中正确的是 ( )
- 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 🔄 举一反三
- 下列函数中,能与
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),不构成重载。
:::
::::
- A.
:::::
- 下列关于纯虚函数的描述中,错误的是 ( )
- A. 在基类中只有声明,通常没有函数体定义
- B. 可以使用包含纯虚函数的类来创建对象
- C. 当需要使用包含纯虚函数的基类的派生类创建对象时,须在派生类中给出该函数定义
- D. 包含纯虚函数的类称为抽象类
::::: details 查看答案与解析
答案:B
解析:
本题考查纯虚函数和抽象类的概念。
第一步:回顾纯虚函数的定义
纯虚函数是在基类中声明但不实现的虚函数,语法为:virtual 返回类型 函数名(参数) = 0;
第二步:逐一分析选项
- A 选项:在基类中只有声明,通常没有函数体定义——正确。纯虚函数在基类中通过
=0声明,通常不提供函数体(但 C++ 允许在类外为纯虚函数提供定义)。 - B 选项:可以使用包含纯虚函数的类来创建对象——错误。包含纯虚函数的类是抽象类,不能实例化(创建对象)。
- C 选项:派生类需要给出纯虚函数的定义才能创建对象——正确。派生类必须实现(override)所有纯虚函数,才能成为具体类并创建对象。
- D 选项:包含纯虚函数的类称为抽象类——正确。
第三步:抽象类的特性
抽象类不能实例化,但可以定义指针和引用,用于实现多态。
难度: ⭐
考点: #纯虚函数 #抽象类 #虚函数
:::: details 💡 学习锦囊
📖 相关公式与知识点:
- 纯虚函数语法:
virtual void func() = 0; - 抽象类 = 包含至少一个纯虚函数的类
- 抽象类不能实例化(不能创建对象)
- 派生类必须实现所有纯虚函数才能实例化
- 抽象类可以定义指针和引用
::: tip 思路分析
看到"纯虚函数"→ 想到"=0"→ 想到"抽象类"→ 想到"不能创建对象"。
:::
::: warning 易错点
- 混淆虚函数和纯虚函数——虚函数有函数体,纯虚函数没有
- 认为抽象类完全不能使用——实际上可以定义指针/引用
:::
::::
:::: details 🔄 举一反三
- 下列关于抽象类的描述中,正确的是 ( )
- A. 抽象类中不能定义构造函数
- B. 抽象类不能定义数据成员
- C. 抽象类可以作为基类被继承
- D. 抽象类中的所有函数都必须是纯虚函数
::: details 查看练习答案与解析
答案:C
解析:抽象类可以作为基类被继承,这是它的主要用途——定义接口规范。A 错误,抽象类可以有构造函数(供派生类调用);B 错误,抽象类可以有数据成员;D 错误,抽象类中可以有非纯虚函数(普通成员函数)。
:::
::::
:::::
- 下列关于析构函数的描述中正确的是 ( )
- A. 析构函数可以重载
- B. 析构函数可以是虚函数
- C. 析构函数名与类名相同
- D. 析构函数的返回类型为 void
::::: details 查看答案与解析
答案:B
解析:
本题考查析构函数的特性。
第一步:回顾析构函数的基本特征
析构函数在对象生命周期结束时自动调用,用于释放资源。其特征包括:
- 函数名:
~类名 - 无返回值类型(连 void 也不写)
- 无参数,因此不能重载
- 一个类只有一个析构函数
第二步:逐一分析选项
- A 选项:析构函数可以重载——错误。析构函数没有参数,无法重载。
- B 选项:析构函数可以是虚函数——正确。将基类的析构函数声明为虚函数,可以确保通过基类指针删除派生类对象时,正确调用派生类的析构函数。
- C 选项:析构函数名与类名相同——错误。析构函数名是
~类名,不是类名本身。 - D 选项:析构函数的返回类型为 void——错误。析构函数没有返回类型。
第三步:虚析构函数的重要性
当通过基类指针删除派生类对象时,如果析构函数不是虚函数,只会调用基类的析构函数,可能导致派生类资源泄漏。
难度: ⭐
考点: #析构函数 #虚析构函数 #资源管理
:::: details 💡 学习锦囊
📖 相关公式与知识点:
- 析构函数格式:
~类名() { ... } - 析构函数无参数、无返回值、不可重载
- 虚析构函数:
virtual ~类名() { ... } - 基类析构函数建议声明为虚函数
- 析构函数调用顺序:先派生类析构,后基类析构
::: tip 思路分析
析构函数的关键特征:~ 开头、无参、无返回值、唯一。虚析构函数是多态正确释放资源的关键。
:::
::: warning 易错点
- 认为析构函数名与类名相同——实际是
~类名 - 忘记将基类析构函数声明为虚函数——导致派生类资源泄漏
:::
::::
:::: details 🔄 举一反三
-
下列代码的输出结果是什么?
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。
:::
::::
:::::
- 下列关于纯虚函数的描述中,正确的是 ( )
- A. 纯虚函数是一种特殊的虚函数,它是个空函数
- B. 具有纯虚函数的类称为虚基类
- C. 一个基类中说明有纯虚函数,其派生类一定要实现该纯虚函数
- D. 具有纯虚函数的类不能创建类对象
::::: details 查看答案与解析
答案:D
解析:
本题考查纯虚函数和抽象类的正确理解。
第一步:逐一分析选项
- A 选项:纯虚函数是个空函数——错误。纯虚函数是"没有实现"的函数(=0),不是"空函数"(空函数有函数体
{})。 - B 选项:具有纯虚函数的类称为虚基类——错误。具有纯虚函数的类称为"抽象类";"虚基类"是解决菱形继承问题的概念(
virtual继承)。 - C 选项:派生类一定要实现该纯虚函数——错误。派生类可以不实现纯虚函数,但此时派生类也是抽象类,不能实例化。
- D 选项:具有纯虚函数的类不能创建类对象——正确。这是抽象类的核心特性。
第二步:区分关键概念
- 纯虚函数 ≠ 空函数:
virtual void f() = 0;(纯虚函数)vsvirtual void f() {}(空实现的虚函数) - 抽象类 ≠ 虚基类:抽象类(含纯虚函数)vs 虚基类(virtual 继承的基类)
难度: ⭐
考点: #纯虚函数 #抽象类 #虚基类
:::: details 💡 学习锦囊
📖 相关公式与知识点:
- 纯虚函数:
virtual void f() = 0;——只有声明,没有实现 - 空函数:
virtual void f() {}——有实现,但函数体为空 - 抽象类:包含纯虚函数的类,不能实例化
- 虚基类:使用
virtual继承的基类,解决菱形继承
::: tip 思路分析
区分三个易混淆概念:纯虚函数(=0)、抽象类(含纯虚函数)、虚基类(virtual 继承)。
:::
::: warning 易错点
- 混淆"抽象类"和"虚基类"——两个完全不同的概念
- 认为派生类必须实现纯虚函数——可以不实现,但自身也成为抽象类
:::
::::
:::: details 🔄 举一反三
- 下列关于虚基类的描述中,正确的是 ( )
- A. 虚基类就是包含纯虚函数的类
- B. 虚基类用于解决多重继承中的二义性问题
- C. 虚基类不能有数据成员
- D. 虚基类的构造函数不会被调用
::: details 查看练习答案与解析
答案:B
解析:虚基类(virtual base class)用于解决菱形继承中基类成员的多份拷贝问题。A 错误,包含纯虚函数的是抽象类;C 错误,虚基类可以有数据成员;D 错误,虚基类的构造函数由最派生类负责调用。
:::
::::
:::::
- 复制初始化构造函数的作用是 ( )
- A. 进行数据类型的转换
- B. 用对象调用成员函数
- C. 用对象初始化对象
- D. 用一般类型的数据初始化对象
::::: details 查看答案与解析
答案:C
解析:
本题考查复制(拷贝)构造函数的用途。
第一步:回顾拷贝构造函数的定义
拷贝构造函数是用一个已存在的同类对象来初始化新创建的对象。其典型声明为:
ClassName(const ClassName& other);
第二步:逐一分析选项
- A 选项:进行数据类型的转换——这是转换构造函数的作用(单参数非拷贝构造函数)。
- B 选项:用对象调用成员函数——这是普通成员函数调用的作用。
- C 选项:用对象初始化对象——正确。这正是拷贝构造函数的用途。
- D 选项:用一般类型的数据初始化对象——这是普通构造函数或转换构造函数的作用。
第三步:拷贝构造函数的调用场景
- 用已有对象初始化新对象:
ClassName obj2 = obj1; - 函数参数按值传递对象时
- 函数返回值为对象时
难度: ⭐
考点: #拷贝构造函数 #对象初始化 #深拷贝与浅拷贝
:::: details 💡 学习锦囊
📖 相关公式与知识点:
- 拷贝构造函数声明:
ClassName(const ClassName& obj); - 默认拷贝构造函数执行浅拷贝(逐成员复制)
- 当类包含指针成员时,需要自定义深拷贝
- 调用场景:初始化新对象、值传递参数、值返回对象
::: tip 思路分析
拷贝构造函数 = “用同类对象初始化新对象”。关键词是"初始化"(区别于"赋值")。
:::
::: warning 易错点
- 混淆拷贝构造函数和赋值运算符——拷贝构造是初始化,赋值是已有对象的赋值
- 忘记
const引用参数——应该是const ClassName&
:::
::::
:::: details 🔄 举一反三
- 下列哪种情况不会调用拷贝构造函数? ( )
- 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 是返回值,调用拷贝构造。
:::
::::
- A.
:::::
- 所谓多态性是指 ( )
- A. 不同的对象调用不同名称的函数
- B. 不同的对象调用相同名称的函数
- C. 一个对象调用不同名称的函数
- D. 一个对象调用不同名称的对象
::::: details 查看答案与解析
答案:B
解析:
本题考查面向对象中多态性的概念。
第一步:理解多态的含义
多态(Polymorphism)指的是同一个接口(函数名),不同的对象调用时表现出不同的行为。即"一个接口,多种实现"。
第二步:逐一分析选项
- A 选项:不同对象调用不同名称的函数——这只是普通的函数调用,不是多态。
- B 选项:不同的对象调用相同名称的函数——正确。通过虚函数机制,基类指针/引用调用同名函数时,根据实际对象类型执行不同的函数版本。
- C 选项:一个对象调用不同名称的函数——普通成员函数调用。
- D 选项:一个对象调用不同名称的对象——语法不通。
第三步:多态的两种形式
- 编译时多态(静态多态):函数重载、运算符重载、模板
- 运行时多态(动态多态):虚函数 + 基类指针/引用
难度: ⭐
考点: #多态性 #虚函数 #动态绑定
:::: details 💡 学习锦囊
📖 相关公式与知识点:
- 多态 = 同一接口,不同实现
- 静态多态:函数重载、模板(编译时确定)
- 动态多态:虚函数 + 基类指针/引用(运行时确定)
- 动态多态三要素:继承、虚函数、基类指针/引用
::: tip 思路分析
多态的核心:“同名函数,不同行为”。通过基类指针调用虚函数时,实际执行的是派生类的版本。
:::
::: warning 易错点
- 认为函数重载就是多态的全部——重载只是静态多态
- 忘记多态需要基类指针/引用——直接通过对象调用不会触发多态
:::
::::
:::: details 🔄 举一反三
-
下列代码的输出结果是什么?
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()。这就是运行时多态。
:::
::::
:::::
- 要将类 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
- A.
::::: 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 🔄 举一反三
- 在菱形继承结构中,如果不使用虚基类,最终派生类中会包含几份基类成员的拷贝? ( )
- A. 1 份
- B. 2 份
- C. 3 份
- D. 4 份
::: details 查看练习答案与解析
答案:B
解析:在典型的菱形继承中(B 和 C 都继承 A,D 同时继承 B 和 C),如果不使用虚基类,D 中会包含 2 份 A 的成员拷贝(分别来自 B 和 C 路径)。使用虚基类后,D 中只有 1 份 A 的成员拷贝。
:::
::::
:::::
- 标准模板库(STL)所涉及的 4 个最主要的基本组件是 ( )
- A. 容器、迭代器、算法、函数模板
- B. 类模板、运算符重载函数、容器、算法
- C. 容器、算法、迭代器、函数对象
- D. 类、对象、迭代器、函数
::::: details 查看答案与解析
答案:C
解析:
本题考查 STL(Standard Template Library)的核心组件。
第一步:回顾 STL 的四大组件
STL 由以下四个核心组件构成:
- 容器(Containers):存储数据的模板类,如
vector、list、map - 算法(Algorithms):操作数据的模板函数,如
sort、find、copy - 迭代器(Iterators):连接容器和算法的"胶水",提供遍历容器的方法
- 函数对象(Functors):重载了
operator()的类对象,可作为算法的策略参数
第二步:逐一分析选项
- A 选项:将"函数对象"误写为"函数模板"——错误。
- B 选项:类模板和运算符重载不是 STL 的核心组件——错误。
- C 选项:容器、算法、迭代器、函数对象——正确。
- D 选项:类、对象是面向对象的基本概念,不是 STL 组件——错误。
难度: ⭐
考点: #STL #标准模板库 #容器 #迭代器 #算法
:::: details 💡 学习锦囊
📖 相关公式与知识点:
- STL 四大组件:容器、算法、迭代器、函数对象
- 常用容器:
vector(动态数组)、list(双向链表)、map(键值对)、set(集合) - 常用算法:
sort、find、for_each、copy - 迭代器类型:输入、输出、前向、双向、随机访问
- 函数对象:重载
operator()的类
::: tip 思路分析
STL = 容器(存数据)+ 算法(处理数据)+ 迭代器(遍历数据)+ 函数对象(定制行为)。
:::
::: warning 易错点
- 将"函数对象"记成"函数模板"——函数模板是泛型编程的基础,但不是 STL 四大组件之一
- 忘记迭代器是独立组件——迭代器是容器和算法之间的桥梁
:::
::::
:::: details 🔄 举一反三
- 下列关于 STL 容器的描述中,错误的是 ( )
- A.
vector支持随机访问 - B.
list支持随机访问 - C.
map存储键值对 - D.
set中的元素自动排序
::: details 查看练习答案与解析
答案:B
解析:list是双向链表,不支持随机访问(不能使用[]运算符),只能通过迭代器顺序访问。vector是动态数组,支持随机访问;map存储键值对并按键自动排序;set存储唯一元素并自动排序。
:::
::::
- A.
:::::
更多推荐
所有评论(0)