知识回顾:
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,访问指针指向的内容)。返回类型 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