之前没有细想过两者的区别,今天对此进行简要记录,后续完善补充。

复制构造函数是在类对象被创建时调用的,但是赋值运算符是被已经存在的对象调用完成赋值操作。

复制构造函数只在对象实例化时才被调用,即在复制构造函数调用期间,这个对象处于未决状态(直到复制构造函数被成功调用),另外复制构造函数没有返回值。

赋值运算符则是在一个现存对象被赋予新的值时才被调用,并且它有返回值(可以返回类对象,也可以返回类对象引用)

举个例子:

class A
{
public:
A()
{
cout<<"class create"<<endl;
}
A(const A &a)
{
cout<<"class copy"<<endl;
}
A &operator=(const A &a)
{
cout<<"override ="<<endl;
return *this;
}
}; int main()
{
//
A x; //
A y(x); //
A z;
z = y; //
A w = x; return ;
}

给出输出结果,再进行分析:

1:定义类对象x,调用构造函数,输出class create

2:将类对象x复制给y,y是一个待进行实例化的对象,这里调用复制构造函数,输出class copy

3:定义类对象z,调用构造函数,输出class create,然后将y复制给z,这里z已经是一个现存的对象,这里调用赋值运算符重载。输出override =

4:属于隐式类转换,调用复制构造函数实例化类对象w,输出class copy。一般情况下,抑制隐式转换,可以采用explicit关键字。

上述赋值运算符重载函数返回类型为引用,如果返回类型为对象即 A operator=(const A &a),则会由于生成一个临时对象作为返回值复制给z,从而调用复制构造函数,并在返回后调用析构函数删除临时对象。测试如下:

class A
{
public:
A()
{
cout<<"class create"<<endl;
}
A(const A &a)
{
cout<<"class copy"<<endl;
}
A operator=(const A &a) //返回对象
{
cout<<"override ="<<endl;
return *this;
}
~A()
{
cout<<"class delete"<<endl;
}
}; int main()
{
//
A x; //
A y(x); //
A z;
z = y; //返回临时对象复制给z,不是返回的对象y的引用。 //
A w = x; return ;
}

结果如下:

C++学习之路(五):复制构造函数与赋值运算符重载的更多相关文章

  1. C++类的复制构造函数和赋值运算符

    前言: C++面向对象的编程过程中,凡是在类中运用到动态内存分配的时候总是会写一个显示的复制构造函数和赋值重载运算符,本文将结合C++ Primer Plus一书的内容分析下原因: 一.在C++编程中 ...

  2. 我的c++学习(7)引用和复制构造函数

    一.引用 什么是引用? 引用又称别名(alias),是一种非常特殊的数据类型.它不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是 C++系统不为引用类型变量分配内存空间.引用主要用 ...

  3. C++ 复制构造函数 与 赋值运算符

    在C++中,将一个对象赋给另外一个对象,编译器将提供赋值运算符的定义. 有两种情况,下面假设catman是Monster的一个实例 第一种:初始化 Monster golblen= catman; 第 ...

  4. 析构函数-复制构造函数-赋值操作符重载-默认构造函数<代码解析>

    通过下面primer中的一道习题,可以更深刻的了解,析构函数,复制构造函数,赋值操作符重载,默认构造函数的使用. 但是我的结果与primer习题解答里面的并不相同,可能是编译器不同的原因导致. // ...

  5. C++的转换构造函数、拷贝构造函数、赋值运算符重载

    1 转换构造函数     C++的转换构造函数是只有一个参数的构造函数.当程序试图将一个其他类型的对象或基本类型值赋给该类的一个待初始化对象时(如Person p="Dean";) ...

  6. redis——学习之路五(简单的C#使用redis)

    redis官方推荐使用的客户端程序 打星星表示推荐使用的客户端程序,一个笑脸表示最近6个月内有过正式活动的.http://redis.io/clients/#c 从这里我们可以判断官方推荐我们使用Se ...

  7. 嵌入式Linux驱动学习之路(五)u-boot启动流程分析

    这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加 ...

  8. zigbee学习之路(五):定时器1(查询方式)

    一.前言 今天,我们来学习几乎所有单片机都有的功能,定时器的使用,定时器对单片机来说是相当重要的,有了它,单片机就可以进行一些复杂的工作. 二.原理与分析 谈到定时器的控制,我们最先想到的是要给它赋初 ...

  9. Java学习之路(五)

    1:补充: 使用super也可以调用父类的成员函数  格式 :  super.函数名(); 2:抽象类与抽象函数 抽象函数的定义: 只有函数的定义,没有函数体的函数被称为抽象函数 抽象类的定义: 使用 ...

随机推荐

  1. 第61天:json遍历和封装运动框架(多个属性)

    一.json 遍历  for in  关键字  for ( 变量 in  对象)  { 执行语句;  } 例如: var json = {width:200,height:300,left:50}co ...

  2. 【bzoj1370】[Baltic2003]Gang团伙 并查集

    题目描述 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一个团伙.告诉你关于这n个人的m条信息, ...

  3. CentOS 文本搜索grep

    grep 用于在文本中执行关键词搜索, 用法: grep [选项]... PATTERN [FILE]... [root@bigdata-senior01 ~]# grep "ftp&quo ...

  4. Unity游戏开发技术的最佳实践

    活动详情   作为全球规模最大的Unity开发者聚会,历年的Unite大会都成为开发者们获取Unity最新技术知识,交流开发经验,把握行业发展脉搏,体验全球前沿科技与高品质Made with Unit ...

  5. BZOJ3165 & 洛谷4097:[HEOI2013]Segment——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3165 https://www.luogu.org/problemnew/show/P4097 要求 ...

  6. BZOJ3224:普通平衡树——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3224 题面源于洛谷 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下 ...

  7. BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 5003  Solved: 1725 [Submit] ...

  8. sass的mixin,extend,placeholder,function

    1. mixin 就是定义了一个函数,可以传参,并且设定默认值,css选择器可以通过@include来引用,mixin混入的代码,就是原样复制,不会合并,会造成冗余 例如: @mixin br6($b ...

  9. dbms_output.put与put_line

    BEGIN DBMS_OUTPUT.ENABLE (buffer_size => NULL);--with no limit on the output. dbms_output.put('a' ...

  10. Http字段含义

    转载自:http://blog.csdn.net/sand_ant/article/details/10503579 一.request请求Header简介 Accept:--客户机支持的类型 Acc ...