建英文产品网站,建设网站内容的策划书,北京商场招商信息,贾汪徐州网站开发一、前言本部分为C语言刷题系列中的第8节#xff0c;主要讲解这几个知识点#xff1a;复制构造函数和赋值运算符重载函数。欢迎大家提出意见、指出错误或提供更好的题目#xff01;二、知识点讲解知识点1#xff1a;复制构造函数1、当依据一个已存对象创建一个新对象时语言刷题系列中的第8节主要讲解这几个知识点复制构造函数和赋值运算符重载函数。欢迎大家提出意见、指出错误或提供更好的题目二、知识点讲解知识点1复制构造函数1、当依据一个已存对象创建一个新对象时会自动调用复制构造函数以便将旧对象的内容复制到新对象中进行初始化。例如按值传递对象或按值返回对象。2、如果类没有定义复制构造函数则编译器会自动添加一个默认的复制构造函数。该默认复制构造函数将旧对象的内容完整复制给新对象也称之为浅复制。3、当类中存在指针型的成员变量时应该提供一个自定义的复制构造函数以实现依据内容的深层复制。4、复制构造函数的形式X(const X x);知识点2赋值运算符重载函数1、当将一个已存对象赋值给另一个已存对象时会自动调用赋值运算符重载函数以便将右值对象的内容复制到左值对象中。2、如果类没有定义赋值运算符重载函数则编译器会自动添加一个默认的赋值运算符重载函数。因此赋值运算符重载函数只能以成员函数的方式实现不能以友元函数的方式实现。同时该默认赋值运算符重载函数将右值对象的内容完整复制给左值对象也称之为浅复制。3、当类中存在指针型的成员变量时应该提供一个自定义的赋值运算符重载函数以实现依据内容的深层复制。4、赋值运算符重载函数的形式X operator(const X x);三、试题解析1有如下类定义class Bag{public:Bag(int p200,char sM) { pricep; sizes; coutprivate:int price;char size;};若执行语句Bag Alice, Kelly(Alice), *Twins[2], F4[4];则输出结果为( )。AMMMMMMMMBMMMMMMCMMMMMDMMMM正确答案C解析1、Bag Alice语句创建一个新对象调用构造函数Bag(int p200, char sM),输出M。2、Bag Kelly(Alice)语句由已存对象创建新对象调用编译器生成的复制构造函数没有输出内容。3、Bag *Twins[2]语句定义一个具有2个元素的指针数组不涉及到对象的创建不调用任何构造函数也无任何输出。4、Bag F4[4]语句定义了具有4个Bag对象的数组会调用构造函数Bag(int p200, char sM)四次输出4个M。所以输出结果为MMMMM。2.有如下程序#include using namespace std;class TV{public:TV(int s41):size(s) { }TV(const TV r):size(r.size) { }~TV() { }private:int size;};TV fun(TV u) { TV tu; return t; }void main() { TV x, y; xfun(y); }则 TV 类的复制构造函数被调用的次数是( )。A.1次B.2次C.3次D.4次答案B解析当依据一个已存对象创建一个新对象时会调用复制构造函数。语句TV tu;是由已存对象u创建新对象t会调用一次复制构造函数。Return t;按值返回也符合由已存对象创建一个新对象会调用一次复制构造函数。因此共调用2次复制构造函数B选项正确。3.为类MyClass重载赋值运算符时应将其重载为类的( )。A.静态函数B.成员函数C.友元函数D.虚函数正确答案B解析如果类中没有定义赋值运算符重载函数则编译器会自动提供一个默认的赋值运算符重载函数。因此赋值运算符重载函数必须是类的成员函数正确答案为B。四、试题测试1.下列情况中不会调用复制构造函数的是( )。A.用一个对象去初始化同一类的另一个新对象时B.将类的一个对象赋值给该类的另一个对象时C.函数的形参是类的对象调用函数进行形参和实参结合时D.函数的返回值是类的对象函数执行返回调用时2.有如下程序#include using namespace std;class Test{public:Test(int i0) { coutTest(const Test x) { coutTest operator (const Test x){coutreturn *this;}~ Test() { cout};void main(){Test obj1(1), obj2(obj1), obj3obj1;}运行时的输出结果是( )。A.AABDDDB.AACADDDDC.ABBDDDD.ABCADDDD3.下列关于赋值运算符重载的叙述中正确的是( )。A.赋值运算符只能作为类的成员函数重载B.默认的赋值运算符实现了深层复制功能C.重载的赋值运算符函数有两个本类对象作为形参D.如果已经定义了复制构造函数就不能重载赋值运算符4.有如下类定义class MyClass{public:MyClass(const char *cNULL);~MyClass();______________ //运算符的声明private:char *p;};若要使语句序列MyClass s1(test), s2;s2s1;能够正常运行横线处的语句应为( )。A. friend MyClass operator(const MyClass);B. MyClass operator(const MyClass);C. MyClass operator(MyClass,const MyClass);D. friend MyClass operator(MyClass,const MyClass);------------------------------欢迎大家提出意见、指出错误或提供更好的题目只有大家的共同努力才能帮助更多人掌握C的基本概念顺利通过考试