
🫧个人主页:小年糕是糕手
💫个人专栏:《C++》《C++同步练习》《数据结构》《C语言》
🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来!

目录
一、拷贝构造函数
知识回顾:
- 本质:类的特殊构造函数,参数为 "自身类的常量引用",用于用已有对象创建新对象时,复制其数据。
- 核心目的:实现对象的 "值拷贝",确保新对象与原对象独立(默认是浅拷贝,需手动实现深拷贝避免问题)。
- 基本用法 :
- 定义:
class 类名 { 类名(const 类名& 原对象) { 拷贝逻辑 } };(如class Person { Person(const Person& p) { age = p.age; } };);- 自动调用场景:对象赋值初始化(
Person p2 = p1;)、函数传值参数(void func(Person p))、函数返回值为对象时。- 规则 :
- 若未显式定义,编译器生成默认拷贝构造函数(仅做浅拷贝,复制成员变量值);
- 当类含动态内存 / 资源(如
new分配的指针)时,必须显式实现深拷贝(否则新旧对象共享资源,销毁时二次释放);- 参数必须是 "常量引用(
const 类名&)",避免递归调用拷贝构造函数。
1、假定MyClass为一个类,则该类的拷贝构造函数的声明语句是()A.MyClass(MyClass x)
B.MyClass &(MyClass x)
C.MyClass(MyClass &x)
D.MyClass(MyClass *x)
答案:C
解析:
A:参数必须是引用,否则造成无限递归
B:语法错误
C:正确
D:这种写法只是普通的构造函数,不能成为拷贝构造函数
2、拷贝构造函数的特点是()A.该函数名同类名,也是一种构造函数,该函数返回自身引用
B.该函数只有一个参数,是对某个对象的引用
C.每个类都必须有一个拷贝初始化构造函数,如果类中没有说明拷贝构造函数,则编译器系统会自动生成一个缺省拷贝构造函数,作为该类的保护成员
D.拷贝初始化构造函数的作用是将一个已知对象的数据成员值拷贝给正在创建的另一个同类的对象
答案:D
解析:
A:拷贝构造函数也是一构造函数,因此不能有返回值
B:该函数参数是自身类型的对象的引用
C:自动生成的缺省拷贝构造函数,作为该类的公有成员,否则无法进行默认的拷贝构造
D:用对象初始化对象这是拷贝构造函数的使命,故正确
二、赋值运算符重载
知识回顾:
- 本质 :重载
=运算符的成员函数,用于两个已存在对象之间的赋值操作(区别于拷贝构造的 "创建新对象")。- 核心目的:实现对象的 "赋值拷贝",解决默认浅拷贝导致的资源共享问题(如动态内存重复释放)。
- 基本用法 :
- 定义:
class 类名 { 类名& operator=(const 类名& 原对象) { 赋值逻辑; return *this; } };(如Person& Person::operator=(const Person& p) { age = p.age; return *this; });- 调用场景:已创建对象的赋值(
p2 = p1;,p2、p1 均已存在)。- 规则 :
- 若未显式定义,编译器生成默认赋值运算符(仅做浅拷贝,复制成员变量值);
- 需实现 "深拷贝"(类含动态资源时),并先释放当前对象原有资源(避免内存泄漏);
- 返回值为 "自身类的引用(
类名&)",以支持链式赋值(如p3 = p2 = p1;);- 需处理 "自赋值" 情况(
p = p;),避免非法操作。
1、已知表达式++a中的"++"是作为成员函数重载的运算符,则与++a等效的运算符函数调用形式为()A.a.operator++( )
B.a.operator++(0)
C.a.operator++(int)
D.operator++(a,0)
答案:A
解析:
A:正确
B:operator++()传递了整形参数,故为后置++,错误
C:调用函数传递类型,导致语法错误
D:参数过多,语法错误
2、在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是()A.无操作数的运算符
B.二元运算符
C.前缀一元运算符
D.后缀一元运算符
答案:C
解析:
A:重载为成员函数时,其函数的参数个数与真实的函数参数个数会减少1个,减少的则通过this指针进行传递,所以无参则说明有一个参数,故错误
B:无参成员函数相当于有一个参数的全局函数,不能是二元运算符
C:正确
D:区分前缀后缀时,后缀运算需要加一个int参数
知识回顾:前缀一元运算符
- 本质 :仅需一个操作数,且运算符位于操作数前面 的运算符(如
++a、--b、!flag)。- 核心目的:对单个操作数进行自增、自减、取反等逻辑操作,直接修改或判断操作数本身。
- 常见类型 :
- 自增:
++(如++x,x 先加 1 再参与运算);- 自减:
--(如--y,y 先减 1 再参与运算);- 逻辑取反:
!(如!isValid,布尔值取反);- 地址符:
&(如&num,获取变量地址);- 解引用:
*(如*p,访问指针指向的内容)。- 重载规则(C++) :
- 作为成员函数重载:
返回类型 operator运算符() { 逻辑; }(如int& operator++() { ++value; return *this; });- 无额外参数(因操作数是当前对象),返回引用以支持连续操作(如
++(++a));- 区别于后缀一元运算符(需加
int占位参数区分,如operator++(int))。
3、哪个操作符不能被重载()A.*
B.( )
C..(点)
D.[ ]
E.->
答案:C
解析:
A:可以,例如重载对象取值,典型有以后学到的智能指针
B:可以,例如以后学到的仿函数就是通过重载()实现的
C:不能,不能被重载的运算符只有5个, 点号(.)、三目运算(? :)、作用域访问符(::)、运算符sizeof以及.*
D:可以,例如重载对象的指向,典型有以后学到的智能指针
4、下列关于赋值运算符"="重载的叙述中,正确的是()A.赋值运算符只能作为类的成员函数重载
B.默认的赋值运算符实现了"深层复制"功能
C.重载的赋值运算符函数有两个本类对象作为形参
D.如果己经定义了复制拷贝构造函数,就不能重载赋值运算符
答案:A
解析:
A:赋值运算符在类中不显式实现时,编译器会生成一份默认的,此时用户在类外再将赋值运算符重载为全局的,就和编译器生成的默认赋值运算符冲突了,故赋值运算符只能重载成成员函数
B:默认赋值运算符实现的是 "浅拷贝"(仅复制成员变量的数值,不处理动态资源),深拷贝需要手动实现
C:参数只有一个,另一个通过this指针传递
D:复制拷贝构造函数和赋值运算符重载是独立的,定义拷贝构造函数后仍可重载赋值运算符(二者常用于实现深拷贝)
5、若要对data类中重载的加法运算符成员函数进行声明,下列选项中正确的是()A.Data operator+(Data);
B.Data operator(Data);
C.operator+(Data,Data);
D.Data+(Data);
答案:A
解析:
A:正确
B:语法错误,缺少运算符+
C:成员函数参数过多
D:没有运算符重载关键字operator
