C++拷贝构造函数、赋值运算符重载

1.拷贝构造函数

拷贝构造函数的写法如图所示

调用方式如下

接下来我来说说它的特征

1.1特征

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
拷贝构造函数也是特殊的成员函数,其特征如下:
1. 拷贝构造函数是构造函数的一个重载形式。
2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。

如上图所示,倘若我们采用传值调用,那么编译器在遇到const Date date这个形参时会去调用构造函数,但是没有合适的构造函数来调用就会找到拷贝构造函数(是构造函数的一个重载形式),然后就会陷入无穷的递归调用。

3. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。
5. 拷贝构造函数典型调用场景:

        使用已存在对象创建新对象;

        函数参数类型为类类型对象;

        函数返回值类型为类类型对象。

2.赋值运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

函数名字为:关键字operator后面接需要重载的运算符符号。

函数原型:返回值类型 operator操作符(参数列表)

注意:

        不能通过连接其他符号来创建新的操作符:比如operator@;

        重载操作符必须有一个类类型参数;

        用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义;

        作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this。

.*   ::    sizeof   ?:    . 注意以上5个运算符不能重载。

这里我们看看赋值运算符重载

使用方式就是正常写法

这里我们注意一下赋值运算符重载格式:

参数类型:const T&,传递引用可以提高传参效率。

返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值。

检测是否自己给自己赋值。

返回*this :要复合连续赋值的含义。
注意:赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。
还有一点:

用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。

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

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

相关文章

python接口自动化(二)--什么是接口测试、为什么要做接口测试(详解)

什么是接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。  一般来说,测试接…

【JavaEE进阶】 图书管理系统开发日记——肆

文章目录 🍃前言🎍约定前后端交互接⼝🍀服务器代码实现🚩控制层🚩业务层🚩数据层 🌴前端代码的修改⭕总结 🍃前言 今天我们来实现修改图书模块 首先我们先来看一下,需要…

前端学习笔记 | HTML5+CSS3静态网页制作的技巧(持续更新)

注:本文的css样式均使用less写法 1、字体居中 (1)先text-align:center;行内元素水平居中 (2)再line-heigh:(盒子高度);行内元素垂直居中 text-align: center;line-height: ( 30 / vw ); 2、盒子居中 情景1&#…

FCIS 2023:洞悉网络安全新前沿,引领未来安全创新狂潮

在数字化浪潮席卷全球的今天,网络安全问题愈发凸显其重要性。 FCIS 2023网络安全创新大会作为业界瞩目的盛会,不仅汇聚了国际顶尖的网络安全专家,更展示了最前沿的安全技术与研究成果。那么,参与这场大会,我们究竟能学…

寒假作业2月4号

第三章 类与构造函数 一.选择题 1、下列不能作为类的成员的是(B) A. 自身类对象的指针 B. 自身类对象 C. 自身类对象的引用 D. 另一个类的对象 2、假定AA为一个类,a()为该类公有的函数成员,x为该类的一个对象&am…

Aigtek高压放大器用途是什么呢

高压放大器在电子领域中扮演着至关重要的角色,其主要作用是将低电压信号放大到更高的电压水平。这种类型的放大器广泛用于各种应用中,以下是高压放大器的用途以及其关键作用的详细介绍。 1、科学研究和实验室应用: 高压放大器在科学研究和实验…

C++类和对象补充篇

目录 1.再谈构造函数1.1构造函数体赋值1.2 初始化列表1.3 explicit关键字 2.static成员2.1概念2.2 特性 3.友元3.1友元函数3.2友元类 4.内部类5.匿名对象6.拷贝对象时的一些编译器优化7.再次理解类和对象 1.再谈构造函数 1.1构造函数体赋值 在创建对象时,编译器通…

elastic-job VS xxl-job

1、Elastic-job介绍 Elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案 , 由两个相对独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 。Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务…

【数据结构】排序---C语言版

七大排序算法 一、对于排序的分类:二、插入排序1、直接插入排序(1)基本思想:(2)直接插入排序:(3)代码实现:(4)总结: 2、希…

C++写算法题时常见问题(稳定更新)

目录 1.如何用 getline 函数读取用户输入的一行 2.如何防止用 scanf 读取字符时读取了 换行和空格 3.map和unordered_map的差别和使用 4.“表达式求值”问题解析 5.运行报RE错误 6.在set或者map里面使用结构体 7.运行时报TLE时,时间复杂度问题 8.double类型的…

ncc匹配(一,理论)

前头从来没用过ncc,基于形状匹配搞定后,又翻了翻learning opencv,他并不推荐ncc,而是力推emd,这也是当初我没考虑用ncc的原因。 当初看到ncc公式很复杂,也就忘了。 我的第一个匹配,是最笨的&a…

软件测试Bug系列之4个基本步骤(一)

目录 1.发现bug 2.提交bug 3.跟踪bug 4.总结bug 只要你一个测试人员 ,就肯定离不开提交bug,跟踪bug的工作 。对于大多数的功能测试人员来说 ,占比最多的工作就是和bug打交道 。可以说它是我们最重要的一块业绩 。所以,有必要静…