一、前言

本部分为C++语言刷题系列中的第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 p=200,char s='M') { price=p; size=s; cout<

private:

int price;

char size;

};

若执行语句

Bag Alice, Kelly(Alice), *Twins[2], F4[4];

则输出结果为( )。

A.MMMMMMMM

B.MMMMMM

C.MMMMM

D.MMMM

正确答案:C

解析:1、Bag Alice语句创建一个新对象,调用构造函数Bag(int p=200, char s='M'),输出M。2、Bag Kelly(Alice)语句由已存对象创建新对象,调用编译器生成的复制构造函数,没有输出内容。3、Bag *Twins[2]语句定义一个具有2个元素的指针数组,不涉及到对象的创建,不调用任何构造函数,也无任何输出。4、Bag F4[4]语句定义了具有4个Bag对象的数组,会调用构造函数Bag(int p=200, char s='M')四次,输出4个M。所以,输出结果为MMMMM。

2.有如下程序:

#include

using namespace std;

class TV

{

public:

TV(int s=41):size(s) { }

TV(const TV &r):size(r.size) { }

~TV() { }

private:

int size;

};

TV fun(TV &u) { TV t=u; return t; }

void main() { TV x, y; x=fun(y); }

则 TV 类的复制构造函数被调用的次数是( )。

A.1次

B.2次

C.3次

D.4次

答案:B

解析:当依据一个已存对象创建一个新对象时,会调用复制构造函数。语句TV t=u;是由已存对象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 i=0) { cout<

Test(const Test &x) { cout<

Test& operator =(const Test &x)

{

cout<

return *this;

}

~ Test() { cout<

};

void main()

{

Test obj1(1), obj2(obj1), obj3=obj1;

}

运行时的输出结果是( )。

A.AABDDD

B.AACADDDD

C.ABBDDD

D.ABCADDDD

3.下列关于赋值运算符=重载的叙述中,正确的是( )。

A.赋值运算符只能作为类的成员函数重载

B.默认的赋值运算符实现了"深层复制"功能

C.重载的赋值运算符函数有两个本类对象作为形参

D.如果已经定义了复制构造函数,就不能重载赋值运算符

4.有如下类定义:

class MyClass

{

public:

MyClass(const char *c=NULL);

~MyClass();

______________ //运算符=的声明

private:

char *p;

};

若要使语句序列

MyClass s1("test"), s2;

s2=s1;

能够正常运行,横线处的语句应为( )。

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++的基本概念,顺利通过考试!

c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...相关推荐

  1. c++类指针赋值表达式必须是可修改的左值_C生万物,编程之本!(c语言基础笔记)

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  2. c++类指针赋值表达式必须是可修改的左值_C++进阶教程系列:全面理解C++中的类...

    原标题:C++进阶教程系列:全面理解C++中的类 关注Linux公社 最近刷了一些题,也面试了一些公司,把关于C++中关于类的一些概念总结了一下. 在这里也反思一下,面试前信心满满自以为什么都懂,毫无 ...

  3. c 表达式必须是可修改的左值_C++中的左值,右值,左值引用,右值引用

    童帅 2020-2-22 文中的"表达式"都是指赋值表达式 左值,右值,左值引用,右值引用 到底是什么 左值和右值 int a = 10; int b = 5; int c = a ...

  4. C++对类(或者结构体)中字符数组赋值时,出现表达式必须是可修改的左值的问题

    最近自己遇到了这类问题,在csdn上找到了很多大神给的解答,非常到位 特别感谢这位: https://blog.csdn.net/JQ_AK47/article/details/53169799 问题 ...

  5. 字符数组赋值报“表达式必须是可修改的左值”的错误

    在C/C++程序中,main函数可以传递了两个参数(int argc, char *argv[]), 后面那个是字符数组,当我们接收直接用字符数组接收参数时会报"表达式必须是可修改的左值&q ...

  6. c++ map 析构函数_C++学习刷题6--C++类的使用:构造函数、析构函数和类的使用

    一.前言 本部分为C++语言刷题系列中的第4节,主要讲解这几个知识点:构造函数.析构函数和类的使用.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 由以前知识可知,类的实现中包含成员变量 ...

  7. 表达式必须是可修改的左值怎么解决_如何解决代码腐败的味道

    一. Duplicated Code(重复代码) 如果你在一个以上的地点看到相同的程序结构,设法将他们合而为一,程序会变得更好. 同一个类的两个函数含有相同的表达式,采用Extract Method( ...

  8. 在保护继承中基类的共有成员_C++学习刷题13--继承的实现、继承的方式

    一.前言 本部分为C++语言刷题系列中的第13节,主要讲解这几个知识点:继承的实现.继承的方式.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:继承的实现,可以理解派生类拥有成 ...

  9. 将派生类指针赋值给基类的指针

    除了可以将派生类对象赋值给基类对象(对象变量之间的赋值),还可以将派生类指针赋值给基类指针(对象指针之间的赋值).我们先来看一个多继承的例子,继承关系为: #include <iostream& ...

最新文章

  1. 手机密钥连接linux主机
  2. java blob压缩_如何从Oracle中用Java压缩的BLOB列中提取XML文档
  3. 【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )
  4. 对于如何删除redis中geo存入的坐标
  5. 目前主流的四大浏览器内核Trident、Gecko、WebKit以及Presto
  6. dederss.php美国与,Dede经验:全站rss/连载和分类首页模板替换
  7. UltraEdit中高亮显示verilog HDL关键词
  8. 荣新linux培训,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  9. 重磅!专硕学制改为三年,多所高校发文!
  10. 运用数组,输出从小到大的10个数
  11. 【HDOJ】1720 A+B coming
  12. 2015年第46周五
  13. 计算机导论操作系统教案,《计算机导论》教案.doc
  14. 出生就遇浏览器大战,亲爹还不爱,命运坎坷的JavaScript终于苦尽甘来
  15. 1.3端口扫描:利用Nmap工具进行端口扫描
  16. 软件如何实现屏幕共享?
  17. java解析json类型的list
  18. Mini CFA 考试练习题 Microeconomics
  19. PHP抓取百度搜索结果页面的【相关搜索词】并存储
  20. 计算机专利英语笔译,基于Trados2014的专利翻译实践报告-英语笔译专业论文.docx...

热门文章

  1. 如何创建MFC模式对话框与非模式对话框
  2. C# TreeNode的使用方法
  3. IOS基础之愤怒的小方块
  4. python数字信号处理应用中文pdf_人邮新书 Python数字信号处理应用 Python在DSP中应用教程 Python基础 Pytho...
  5. nginx输出日志_ingressnginx持久化日志
  6. cvpr 深度估计_干货 | 2019 到目前为止的深度学习研究进展汇总
  7. 深入php内核,从底层c语言剖析php实现原理
  8. 如何设计良好的viewcontroller
  9. 2019 Android 高级面试题总结 从java语言到AIDL使用与原理
  10. 红黄蓝收购新加坡某民营儿童教育集团,宣布更名为GEH Education...