一、前言

本部分为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++学习刷题8--复制构造函数和赋值运算符重载函数...

    一.前言 本部分为C++语言刷题系列中的第8节,主要讲解这几个知识点:复制构造函数和赋值运算符重载函数.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:复制构造函数 1.当依据 ...

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

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

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

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

  4. 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数...

    不多说,直接上干货! 通过 牛客网Java刷题知识点之构造函数是什么.一般函数和构造函数什么区别呢.构造函数的重载.构造函数的内存图解 我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会 ...

  5. 零基础html学习/刷题-第一期

    之前写的html学习的文章都是零零散散的,这次出个整合的专栏,把内容集中起来,做个知识复盘,顺带刷刷题.牛客网非常值得一用,刷题也很好刷!对于基础入门最合适不过. 博主主页:WDm-xmax 原id: ...

  6. 面试学习+刷题笔记分享-屌丝的逆袭之路,2年5个月13天,从外包到拿下阿里offer

    开篇介绍 个人背景: 不说太多废话,但起码要让你先对我有一个基本的了解.本人毕业于浙江某二本院校,算是科班出身,毕业后就进了一家外包公司做开发,当然不是阿里的外包,具体什么公司就不透露了,在外包一呆就 ...

  7. [总结]2019年9月 OI学习/刷题记录

    从现在开始记录一下每天的学习情况.主力LOJ? 2019/9/5 LibreOJ #2543. 「JXOI2018」排序问题 答案显然是\(\frac{(n+m)!}{Cnt_1!Cnt_2!\cdo ...

  8. [总结]2019年10月 OI学习/刷题记录

    10月份记录! 2019/10/1 UOJ #74. [UR #6]破解密码 Hash+分类讨论 UOJ #75. [UR #6]智商锁 Matrix-Tree定理+随机化 UOJ #76. [UR ...

  9. rm linux 复制目录,linux学习(四)复制(cp)移动(mv)删除(rm)查找(find)文件、文件夹操作、软硬链接的区别...

    复制文件 cp命令用于复制文件到制定的目录 语法格式为: cp [选项] 源文件或目录 目标文件或目录 命令选项 含义 cp -d 当复制符号链接时,把目标文件或目录页建立为符号链接,并指向与源文件或 ...

最新文章

  1. dual orcal 虚拟表
  2. oracle 创建数据库 表空间 用户 授权和toad导入导出数据库
  3. 【Java Web前端开发】JavaScript高级
  4. 第二阶段个人博客总结8
  5. Cpp 对象模型探索 / 父类和子类调用构造函数和析构函数的顺序
  6. MMS发送的无线网络连接协议分析
  7. jquery jgrid filterToolBar beforeSearch 修改postData
  8. vmware VCenter6.7以上版本导出ova
  9. 【资讯】国内 42 所一流大学综合排名出炉!清北之后谁是国内第三?
  10. 移动分发端 基础统计指标经典业务代码节选--二次激活用户
  11. 最简单的c语言if程序,C语言简单实用的程序-if else 嵌套式的使用例子
  12. 谈谈tomcat引起的中文乱码问题
  13. html ajax 图片上传,Ajax 上传图片并预览的简单实现
  14. 【转】关于ATSC与DVB的比较
  15. 浅谈对统计机器学习的认识
  16. 游戏自定义金币单位换算管理类
  17. Hiho303周 H国的身份证号码I
  18. 某型雷达的报文收发实录
  19. 使用go实现Aes加解密
  20. 移动互联网-----概述

热门文章

  1. bootstrap 栅栏布局中 col-xs-*、col-sm-*、col-md-*、col-lg-* 区别及使用方法
  2. python3.5 连接mysql_python3.5 連接mysql本地數據庫
  3. mysql执行语句后回退_MySQL命令学习笔记(八)
  4. 小马源码_Java互联网架构-重新认识Java8-HashMap-不一样的源码解读
  5. nginx php image,[Docker]应该把 nginx 和 PHP 放在一个 image 里还是分开?
  6. vcenter服务器修改ip,vcenter服务器默认ip地址
  7. cuda linux编译器_linux下如何编译CUDA+QT(qtcreator下)
  8. java中的构造方法与代码块
  9. Problem D: 栈的基本运算(栈和队列)
  10. CentOS7启用SELinux和Firewall修改ssh端口号