c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数

一、前言

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

014f9df9007dbb19cecd57d076bb9e3a.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORACLE使用WITH AS和HINT MATERIALIZE优化SQL解决FILTER效率低下

原文&#xff1a;http://blog.csdn.net/liangweiwei130/article/details/37882503 ------------------------------------------------- 在做项目的过程中&#xff0c;一个页面使用类似如下的SQL查询数据&#xff0c;为了保密和使用方便&#xff0c;我把项目中有关的表名和字段…

面试题333

2019独角兽企业重金招聘Python工程师标准>>> 面试题333 博客分类&#xff1a; java 1、spring的缓存,mybatis缓存2、介绍下dubbo。A服务调用B服务&#xff0c;B服务又调用C服务,这种情况怎么办3、JVM监控工具有哪些&#xff0c;区别又是什么&#xff08;如能追上各个…

mysql vfp_用 VFP 连接 MYSQL 数据库

今天试了一下用 Visual FoxPro 连接 MySQL 数据库。首先在自己机子上架设 MySQL 数据库&#xff0c;就不多说了&#xff0c;我是直接用 XAMPP 架设的服务器。然后在 VFP 里输入命令&#xff1a;sqlhandle SQLSTRINGCONNECT("driver{MySQL ODBC 5.1 Driver};server127.0.0…

oracle中with的用法及用处

原文出处&#xff1a;http://blog.csdn.net/chenjinlin1/article/details/6572401 ---------------------------------------------------------------- WITH 用于一个语句中某些中间结果放在临时表空间的SQL语句 如 WITH channel_summary AS ( SELECT channels.channel_de…

xpath选择当前结点的子节点

2019独角兽企业重金招聘Python工程师标准>>> xpath选择当前结点的子节点 博客分类&#xff1a; 搜索引擎&#xff0c;爬虫 在通过selenium使用xpath选择节点的时候&#xff0c;可能会遇到这么一种情况&#xff1a;在指定的当前节点下搜索满足要求的节点。 node dri…

mysql中主从复制配置文件_MySQL主从复制 配置文件实例

1、主服务器配置文件# For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html[mysqld]# Remove leading # and set to the amount of RAM for the most important data# cache in MySQL. Start at 70%…

SQL中,where 与 having 的性能比较

原文&#xff1a;http://blog.csdn.net/showshore/article/details/7263115 --------------------------------------------------------- 在做项目的过程中&#xff0c;使用sql语句时&#xff0c;很多时候会用到where或having。 看到国外一个论坛上有人提到两者性能比较的这个…

Spark 独立部署模式

2019独角兽企业重金招聘Python工程师标准>>> Spark 独立部署模式 博客分类&#xff1a; spark 除了在 Mesos 或 YARN 集群上运行之外, Spark 还提供一个简单的独立部署的模块。你通过手动开始master和workers 来启动一个独立的集群。你也可以利用我们提供的脚本 .…

mysql数据库的链接地址_常用数据库连接URL地址大全

1、Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID String user="test"; String password="test"; Con…

数据库中where与having区别~~~

1、where和having的执行级别不同 在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。 having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。…

spring boot 1.5.4 定时任务和异步调用(十)

1 Spring Boot定时任务和异步调用 我们在编写Spring Boot应用中经常会遇到这样的场景&#xff0c;比如&#xff1a;我需要定时地发送一些短信、邮件之类的操作&#xff0c;也可能会定时地检查和监控一些标志、参数等。 spring boot定时任务spring-boot-jsp项目源码&#…

ORA-04063: view DAILY.TMP_TBX_100_0_S4 有错误

执行&#xff1a; CREATE TABLE TMP_TBX_100_0_S3 AS SELECT t.* FROM (select t1.*,NULL AS sdate, NULL AS report_id from TMP_TBX_100_0_S4_1 t1 union all select t2.* from TMP_TBX_100_0_S4_2 t2) t 报错&#xff1a; ORA-00955: name is already used by an exis…

MySQL左连接还有过滤条件_MySQL左连接问题,右表做筛选,左表列依然在?

问 题原料两张表&#xff0c;一张user表&#xff0c;一张user_log表(这个例子举的不好)CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8;CREATE TABLE user_log (id int(10) NOT NU…

2017工作总结

静儿总结自己的职业生涯分为三个阶段。第一个阶段为期十年&#xff0c;是纯技术阶段&#xff0c;是人生的积累期。第二个阶段是管理阶段&#xff0c;是综合能力整合期。第三个阶段是突破阶段&#xff0c;打造自己独特的核心竞争力。 第一阶段 刚毕业的同学可能会觉得技术高大上…

批量删除table或view

一个个删太费时了。一个简单可行的方法。 思路&#xff1a; 找出要删除的表名/视图名&#xff0c;然后拼接删除sql&#xff0c;执行。 批量删除表&#xff1a; 1、找出要删除的表名select table_name from user_tables where table_name like S1MSGLATENCY_2016032%;2、复制这…

编译安装mysql5.5.39_编译安装MySQL5.5

防伪码&#xff1a;没有相当程度的孤独是不可能有内心的平和。1、测试环境主机名IP系统MySQL版本MySQL-00192.168.10.23CentOS release 6.9 (Final)5.5.562、部署2.1 卸载之前版本rpm -qa|grep mysqlrpm -e --nodeps mysql-libs-5.1.73-8.el6_8.x86_642.2 安装依赖包和cmakeyum…

你真的了解iOS怎么取属性的吗?

你真的了解iOS怎么取属性的吗&#xff1f; 本文来自CocoaChina粉丝FlyOceanFish投稿如果iOS中谈到取属性&#xff0c;相信大家都会夸夸其谈&#xff0c;不就是get方法吗&#xff1f;或者大谈kvc取属性的机制。不得不说这些也是对的。这时大家可能就疑惑了&#xff0c;那你还要说…

Oracle表的并行度

查看dba_tables数据字典时&#xff0c;可以发现有“DEGREE”字段&#xff0c;这个字段表示的就是数据表的并行度。这个参数的设置&#xff0c;关系着数据库的I/O&#xff0c;以及sql的执行效率。并行度的优点就是能够最大限度的利用机器的多个cpu资源&#xff0c;是多个cpu同时…

mysql 临时表 限制_Mysql临时表

当你创建临时表的时候&#xff0c;你可以使用temporary关键字。如&#xff1a;create temporary table tmp_table(name varchar(10) not null,passwd char(6) not null)‘或CREATE TEMPORARY TABLE IF NOT EXISTS sp_output_tmp ENGINE MEMORY SELECT …from … where IDcurre…

10年老兵给程序员的10条建议!

2019独角兽企业重金招聘Python工程师标准>>> 程序员虽然薪资待遇好&#xff0c;但是也得付出努力&#xff0c;技术好才行。特别是对于刚刚进入编程工作的新手程序员和正在学习编程的同学来说&#xff0c;一写代码就报错&#xff0c;出bug。作为一个工作了10年的老兵…