C++学习之路(五):复制构造函数与赋值运算符重载
之前没有细想过两者的区别,今天对此进行简要记录,后续完善补充。
复制构造函数是在类对象被创建时调用的,但是赋值运算符是被已经存在的对象调用完成赋值操作。
复制构造函数只在对象实例化时才被调用,即在复制构造函数调用期间,这个对象处于未决状态(直到复制构造函数被成功调用),另外复制构造函数没有返回值。
赋值运算符则是在一个现存对象被赋予新的值时才被调用,并且它有返回值(可以返回类对象,也可以返回类对象引用)
举个例子:
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++学习之路(五):复制构造函数与赋值运算符重载的更多相关文章
- C++类的复制构造函数和赋值运算符
前言: C++面向对象的编程过程中,凡是在类中运用到动态内存分配的时候总是会写一个显示的复制构造函数和赋值重载运算符,本文将结合C++ Primer Plus一书的内容分析下原因: 一.在C++编程中 ...
- 我的c++学习(7)引用和复制构造函数
一.引用 什么是引用? 引用又称别名(alias),是一种非常特殊的数据类型.它不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是 C++系统不为引用类型变量分配内存空间.引用主要用 ...
- C++ 复制构造函数 与 赋值运算符
在C++中,将一个对象赋给另外一个对象,编译器将提供赋值运算符的定义. 有两种情况,下面假设catman是Monster的一个实例 第一种:初始化 Monster golblen= catman; 第 ...
- 析构函数-复制构造函数-赋值操作符重载-默认构造函数<代码解析>
通过下面primer中的一道习题,可以更深刻的了解,析构函数,复制构造函数,赋值操作符重载,默认构造函数的使用. 但是我的结果与primer习题解答里面的并不相同,可能是编译器不同的原因导致. // ...
- C++的转换构造函数、拷贝构造函数、赋值运算符重载
1 转换构造函数 C++的转换构造函数是只有一个参数的构造函数.当程序试图将一个其他类型的对象或基本类型值赋给该类的一个待初始化对象时(如Person p="Dean";) ...
- redis——学习之路五(简单的C#使用redis)
redis官方推荐使用的客户端程序 打星星表示推荐使用的客户端程序,一个笑脸表示最近6个月内有过正式活动的.http://redis.io/clients/#c 从这里我们可以判断官方推荐我们使用Se ...
- 嵌入式Linux驱动学习之路(五)u-boot启动流程分析
这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加 ...
- zigbee学习之路(五):定时器1(查询方式)
一.前言 今天,我们来学习几乎所有单片机都有的功能,定时器的使用,定时器对单片机来说是相当重要的,有了它,单片机就可以进行一些复杂的工作. 二.原理与分析 谈到定时器的控制,我们最先想到的是要给它赋初 ...
- Java学习之路(五)
1:补充: 使用super也可以调用父类的成员函数 格式 : super.函数名(); 2:抽象类与抽象函数 抽象函数的定义: 只有函数的定义,没有函数体的函数被称为抽象函数 抽象类的定义: 使用 ...
随机推荐
- BZOJ4736 温暖会指引我们前行(LCT+最大生成树)
类似于瓶颈路,满足条件的路径一定在温度的最大生成树上,那么就是一个LCT维护MST的裸题了. #include<iostream> #include<cstdio> #incl ...
- CentOS 服务ftp(vsftpd)
1.检查是否已经安装vsftpd yum list installed | grep vsftpd 2.安装vsftpd yum install -y vsftpd 3.检查vsftpd system ...
- 【刷题】洛谷 P4329 [COCI2006-2007#1] Bond
题意翻译 有 \(n\) 个人去执行 \(n\) 个任务,每个人执行每个任务有不同的成功率,每个人只能执行一个任务,求所有任务都执行的总的成功率. 输入第一行,一个整数 \(n\) ( \(1\leq ...
- BZOJ5340 & 洛谷4564 & LOJ2552:[CTSC2018]假面——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5340 https://www.luogu.org/problemnew/show/P4564 ht ...
- POJ. 1005 I Think I Need a Houseboat(水 )
POJ. 1005 I Think I Need a Houseboat(水 ) 代码总览 #include <cstdio> #include <cstring> #incl ...
- HDU 5641
King's Phone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- bzoj 4900 [CTSC2017]密钥 模拟+乱搞
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4900 #include<cstring> #include<cmath&g ...
- Moodle配置
Moodle配置 1. 内部设置 在 Moodle 站点管理员界面中有一系列的配置页面(可以从'设置' 块中访问 '网站管理'区).这里有一些重要的系统设置,你需要进行检查. 根据提示信息并结合实 ...
- Python爬虫学习笔记之微信宫格验证码的识别(存在问题)
本节我们将介绍新浪微博宫格验证码的识别.微博宫格验证码是一种新型交互式验证码,每个宫格之间会有一条 指示连线,指示了应该的滑动轨迹.我们要按照滑动轨迹依次从起始宫格滑动到终止宫格,才可以完成验证,如 ...
- sql文件导入时出错
使用Navicat 连接工具连接mysql数据库. mysql数据库建立后,导入sql文件报错: [Err] 1064 - You have an error in your SQL syntax; ...