当前位置: 首页 > news >正文

C++类和对象 ——构造函数

C++拷贝构造函数详解

  • 什么是拷贝构造函数?
  • 拷贝构造函数的特征
  • 默认拷贝构造函数
  • 为什么需要显示定义构造函数?
  • 拷贝构造函数的调用场景
  • 什么时候不需要自己定义拷贝构造函数

什么是拷贝构造函数?

在现实生活中,拷贝构造函数就好像我们上学时候干的一件事——抄作业(doge,但在现实生活中,这是件不好的事,但是在类和对象中,拷贝构造函数确是一个作用极大的东西。

在创建对象时,能否船创建一个与已经存在对象一模一样的对象呢?当然可以,这时候就要使用拷贝构造函数了。

拷贝构造函数: 只有单个形参,该形参是对 本类类型对象的引用(一般常用const修饰),在用 已存在的类类型对象创建新对象时由编译器自动调用
对于内置类型,就相当于 int a = b,这样,用b来构造a
注意: 构造赋值是两件不一样的事,看下面一段代码:

//拷贝构造
int b = 10;
int a = b;//赋值
int a = 10, b;
b = a;

拷贝构造函数的特征

拷贝构造函数也是特殊的成员函数之一:

  1. 拷贝构造函数是构造函数的一个重载形式
  2. 拷贝构造函数的参数只有一个必须是类对象的引用,使用传值方法编译器会强制检查报错,因为会引发无穷递归问题。

相信这里大家一定会有疑惑,为什么传值的方法会引发无穷递归的问题?
看下面一段代码:

#include<iostream>
class Date 
{
private:int _year;int _month;int _day;
public:Date(int year = 1970, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date(const Date& d){std::cout << "Date(const Date& d)" << std::endl;_year = d._year;_month = d._month;_day = d._day;}
}void func(Date d)
{}int main()
{Date d1(2023,5,1);func(d1);return 0;
}

上面这段代码的运行结果如下:
在这里插入图片描述

这说明了什么问题?
我们使用了拷贝构造函数,可是在哪里使用的呢?从代码上看,并没有看到我们使用了拷贝构造啊?

这里就涉及到一个经典的问题了,还记得形参和实参之间的关系吗?没错,就是她俩在搞鬼!!

  • 形参是实参的临时拷贝!!!
  • 形参是实参的临时拷贝!!!
  • 形参是实参的临时拷贝!!!
    重要的事情说三遍,没错!正是因为这个性质,在调用func函数时,我们将d1传给形参d,就发生了用d1来拷贝复制形参的出现,那么有了这一个理解,我们就能了解为什么在设计拷贝构造函数的时候不能使用传值调用了。

因为如果用传值调用,效率不高是一个,另外一个就是调用拷贝复制函数时,形参和实参之间的复制需要一直调用拷贝构造,就会出现无限递归的情况,具体看下图:

在这里插入图片描述

因此,现在的编译器为了避免这种无限递归的产生,会对复制构造函数传值的设计进行强制的检查,一旦我们用传值的方式设计拷贝构造函数,将无法完成编译。

默认拷贝构造函数

若未显示定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象对内置类型是按照字节方式直接拷贝的(这种拷贝又叫做浅拷贝,或者叫值拷贝),而对自定义类型是调用其拷贝构造函数来完成拷贝的。

在前面日期类的基础上,我们再创建一个类,来测试一下这个特性。

#include<iostream>
class Date 
{
private:int _year;int _month;int _day;
public:Date(int year = 1970, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date(const Date& d){std::cout << "Date(const Date& d)" << std::endl;_year = d._year;_month = d._month;_day = d._day;}
};
class Time
{
private:int hour;int min;int second;Date x;
};int main()
{Time d1;Time d2(d1);return 0;
}

在这里插入图片描述

可以看到,我们并没有定义Time类的拷贝构造,所以使用的是系统自动生成的默认拷贝构造函数,而从运行结果看其确实符合上诉所说的特性。

为什么需要显示定义构造函数?

大家刚接触到拷贝构造函数的时候一定有一个问题,竟然编译器生成的拷贝构造函数已经可以完成字节序的值拷贝了,那还需要显示定义吗?也许对日期类这种比较简单的类不需要,那如果是更复杂的一些类呢?看下面的例子:

typedef int DataType; 
class Stack {
public:Stack(size_t capacity = 10) {_array = (DataType*)malloc(capacity * sizeof(DataType)); if (nullptr == _array) {perror("malloc申请空间失败"); return;}_size = 0;_capacity = capacity;}void Push(const DataType& data) {// CheckCapacity();_array[_size] = data; _size++;}~Stack(){if (_array){free(_array); _array = nullptr;_capacity = 0; _size = 0;}} 
private:DataType* _array;size_t _size;size_t _capacity;
};int main()
{Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);Stack s2(s1);return 0;
}

上面这段代码在运行之后将会崩溃,为什么呢?我们首先来看看定义的两个stack对象里保存的东西:

在这里插入图片描述
两个对象动态申请的数组指向同一块空间,这就是默认拷贝构造函数带来的后果,而如此造成的结果并不是我们想要的,在程序结束调用析构的时候,将会对同一块空间释放两次,因此会造成错误。

因此,类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构 造函数是一定要写的,否则就是浅拷贝。

拷贝构造函数的调用场景

  • 使用已存在对象创建新对象
  • 函数参数为类类型对象(形参的拷贝创建)
  • 函数返回值类型为类类型对象(创建临时变量

什么时候不需要自己定义拷贝构造函数

  1. 类成员都是自定义类型
  2. 所有的成员都只需要浅拷贝就能完成任务

好了,以上就是这篇博客的全部内容,如果大伙发现博主哪里写的有问题或者有疑惑的话,欢迎评论区指出!😘

相关文章:

C++类和对象 ——构造函数

C拷贝构造函数详解 什么是拷贝构造函数&#xff1f;拷贝构造函数的特征默认拷贝构造函数为什么需要显示定义构造函数&#xff1f;拷贝构造函数的调用场景什么时候不需要自己定义拷贝构造函数 什么是拷贝构造函数&#xff1f; 在现实生活中&#xff0c;拷贝构造函数就好像我们上…...

第2章-分治法

第2章-分治法 总分&#xff1a;100分 得分&#xff1a;20.0分 1 . 多选题 中等 10分 有关以下代码&#xff0c;说法正确的是&#xff08; ABCE&#xff09; def BinarySearch(s, x, low, high):if (low > high):return -1middle (low high) / 2if (x s[mid…...

20天能拿下PMP吗?

新版大纲&#xff0c;专注于人员、过程、业务环境三个领域&#xff0c;内容贯穿价值交付范围&#xff08;包括预测、敏捷和混合的方法&#xff09;。除了考试时间由240分钟变更为230分钟、200道单选题变为180道&#xff08;包含单选和多选&#xff09;之外&#xff0c;新考纲还…...

Word处理控件Aspose.Words功能演示:在 Java 中将 Word DOC/DOCX 转换为 PDF

Aspose.Words是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理&#xff0c;并…...

数据安全的重要性

数据安全非常重要&#xff0c;因为我们生活在数字化时代&#xff0c;许多信息和数据都以数字形式存储和传输。如果这些数据受到未经授权的访问、篡改、泄露或破坏&#xff0c;会对个人、组织和国家造成严重的损失。 以下是数据安全的重要性&#xff1a; 1. 保护各类隐私&#x…...

要创建富文本内容?Kendo UI Angular组件有专门的编辑器应对!

您的Angular应用程序可能需要允许用户添加带有格式化选项的文本、图像、表格、外观样式和/或链接&#xff0c;使用Kendo UI for Angular的编辑器&#xff0c;可以轻松搞定这些&#xff01; Kendo UI for Angular是专业级的Angular UI组件库&#xff0c;不仅是将其他供应商提供…...

工赋开发者社区 | 装备制造企业数字化转型总体框架

导读 当前&#xff0c;面对技术、市场以及供应链等多重挑战&#xff0c;在软件定义、数据驱动、数字孪生、大数据、人工智能及元宇宙等技术加持下&#xff0c;装备制造企业不断采用新工艺、新材料&#xff0c;以新模式推动产品快速创新。企业积极关注并探索数字化转型路径&…...

Python趋势外推预测模型实验完整版

趋势外推预测模型实验完整版 实验目的 通过趋势外推预测模型&#xff08;佩尔预测模型&#xff09;&#xff0c;掌握预测模型的建立和应用方法&#xff0c;了解趋势外推预测模型&#xff08;佩尔预测模型&#xff09;的基本原理 实验内容 趋势外推预测模型 实验步骤和过程…...

KALI入门到高级【第三章】

预计更新第一章 入门 1.1 什么是Kali Linux&#xff1f; 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 特…...

React Native中防止滑动过程中误触

React Native中防止滑动过程中误触 在使用React Native开发的时&#xff0c;当我们快速滑动应用的时候&#xff0c;可能会出现误触&#xff0c;导致我们会点击到页面中的某一些点击事件&#xff0c;误触导致页面元素响应从而进行其他操作,表现出非常不好的用户体验。 一、问题…...

【c语言】函数递归调用

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ…...

SPSS如何进行判别分析之案例实训?

文章目录 0.引言1.一般判别分析2.逐步判别分析3.决策树分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对判别分析进行阐述。 1…...

Windows 10 字体模糊发虚的问题及解决方法

Windows 10字体模糊发虚! 如何解决?Windows 10是一款常见的操作系统&#xff0c;它拥有各种各样的功能&#xff0c;但是有些用户发现&#xff0c;在使用Windows 10时&#xff0c;字体会变得模糊发虚&#xff0c;这给用户带来了很多不便。下面&#xff0c;我们就来看看如何解决…...

渔人杯部分wp

文章目录 渔人杯神仙姐姐阿拉丁飘啊飘 渔人杯 神仙姐姐 点击拜 &#xff0c;抓包发现get请求了/sx.php 返回如下 {"code":0,"num":1,"flag":"ctfsh0w-f1ag-n0t-h3r3-th1s-msg-just-a-j0ke-}{"}在repeater重复请求&#xff0c;发现…...

测试用例覆盖不全面的解决方法

测试用例覆盖不全面的解决方法 问题分析 在测试用例设计过程中&#xff0c;容易出现思维受限或者需求盲区&#xff0c;我们不可能完全覆盖用户使用的所有场景&#xff0c;编写测试用例的时不可能把所有的场景都能想周全&#xff0c;把所有的场景下的情况都写成测试用例去模拟、…...

AWS Lambda - 第一部分

Hello大家好&#xff0c;我们今天开始讨论AWS Lambda的内容。 SAP认证考试会涉及到很多Lambda的内容&#xff0c;想要通过认证考试虽然不一定非要精通开发&#xff0c;但需要知道Lambda的一些功能和特性、适用场景以及Lambda是如何工作的。 我们开始吧&#xff01; Lambda与…...

Java 基础进阶篇(七)—— 面向对象三大特征之三:多态

文章目录 一、多态的概述二、多态中成员访问特点 ★三、多态的优势与劣势四、多态下的类型转换4.2 自动类型转换&#xff08;从子到父&#xff09;4.2 强制类型转换&#xff08;从父到子&#xff09;4.3 instanceof 关键字 一、多态的概述 多态&#xff1a;是指执行同一个行为…...

day9 实现UDP通信

目录 socket函数拓展 UDP通信实现过程 代码实现 socket函数拓展 send与recv函数&#xff1a; /*用于发送数据*/ ssize_t send(int sockfd, const void *buf, size_t len,int flags);/*用于接收数据*/ ssize_t recv(int sockfd, void *buf, size_t len,int flags);/*前三个…...

自然语言处理(NLP)在放射学报告评价中的应用:应用和技术进展

自然语言处理&#xff08;NLP&#xff09;在放射学报告评价中的应用&#xff1a;应用和技术进展 写在最前面摘要引言先进的技术BERT算法优点 Applications in Radiology 放射学应用Quality 质量将关键发现通知转诊临床医生放射科关键绩效指标和评估 个别放射科医生的表现同行学…...

日常开发为什么需要做Code Review

日常开发为什么需要做Code Review 一、背景 最近在开始一个新的项目&#xff0c;在查看项目中代码及具体细节时&#xff0c;发现这个项目真实一堆乱麻&#xff0c;没有规律可循&#xff0c;可总结下这个项目的缺陷 没有规律可循&#xff0c;没有结构性设计不做公共封装&#…...

OSPF的优化

O_ASE --- 标志域外路由信息 --- 因为域外的路由信息不可控性较强&#xff0c;所以&#xff0c;信任程度较低&#xff0c;我们将其优先级设置为150。 LSA --- 链路状态通告 --- OSPF协议在不同网络环境下产生的用于携带和传递不同的信息。 LSDB --- 链路状态数据库 SPF --- 最短…...

C++项目中打破循环依赖的锁链:实用方法大全

C项目中打破循环依赖的锁链 一、简介&#xff08;Introduction&#xff09;1.1 循环依赖的定义&#xff08;Definition of Circular Dependencies&#xff09;1.2 循环依赖带来的问题&#xff08;Problems Caused by Circular Dependencies&#xff09;1.3 解决循环依赖的重要性…...

IDEA连接HBase

新建maven工程 打开pom.xml添加hbase需要的依赖 <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.3.5</version> </dependency><dependency><groupId>org.apa…...

Mask2Former来了!用于通用图像分割的 Masked-attention Mask Transformer

原理https://blog.csdn.net/bikahuli/article/details/121991697 源码解析 论文地址&#xff1a;http://arxiv.org/abs/2112.01527 项目地址&#xff1a;https://bowenc0221.github.io/mask2former Mask2Former的整体架构由三个组件组成&#xff1a; 主干特征提取器&#xff…...

【量化课程】01_投资与量化投资

文章目录 1.1 什么是投资1.1.1 经济意义上的投资1.1.2 投资的分类1.1.3 金融投资1.1.4 个人投资者投资品种1.1.5 投资VS投机 1.2 股票投资的基本流程1.3 常见的股票投资分析流派1.3.1 投资者分析流派 1.4 什么是量化投资1.4.1 量化投资基本概念1.4.2 量化投资的优势1.4.3 量化投…...

SpringBoot实现导出Excel功能

1 问题背景 需求要做一个导出excel的功能 2 前言 本篇着重阐述后端怎么实现&#xff0c;前端实现的部分只会粗略阐述。该实现方案是经过生产环境考验的&#xff0c;不是那些拿来练手的小demo。本文阐述的方案可以借鉴用来做毕设或者加到自己玩的项目中去。再次声明&#xff0c;…...

NSSCTF之Misc篇刷题记录⑧

NSSCTF之Misc篇刷题记录 [MMACTF 2015]welcome[广东强网杯 2021 团队组]欢迎参加强网杯[虎符CTF 2022]Plain Text[SWPUCTF 2021 新生赛]原来你也玩原神[SWPUCTF 2021 新生赛]我flag呢&#xff1f;[鹤城杯 2021]New MISC NSSCTF平台&#xff1a;https://www.nssctf.cn/ PS&…...

从零开始学习Linux运维,成为IT领域翘楚(七)

文章目录 &#x1f525;Linux下常用软件安装_JDK和Tomcat安装&#x1f525;Linux下常用软件安装_MySQL安装&#x1f525;Linux下常用软件安装_MySQL卸载 &#x1f525;Linux下常用软件安装_JDK和Tomcat安装 Jdk 安装 解压jdk安装包 tar -zxvf jdk-8u201-linux-x64.tar.gz -C/…...

优漫动游设计APP的UI界面需要注意哪些问题?

一、加载   加载时间的长短&#xff0c;很大程度的决定了用户体验是否有所提升&#xff0c;虽然理想中的页面加载出来应该一秒就够了&#xff0c;但是设计师不要忽略网络问题!如果网速不够的话&#xff0c;页面加载三五秒都算是快的了&#xff0c;所以在用户等待的过程中&a…...

面试 004

什么是 Java 内存结构 Java 内存结构就是 JVM 的运行书数据区的内存结构&#xff1a; 里面有堆、虚拟机栈、本地方法栈、程序计数器&#xff1b; 虚拟机栈&#xff1a;里面的数据结构是栈帧&#xff0c;存放了方法名&#xff0c;局部变量等信息 方法区在 1.8 的时候&#xf…...

软件上传网站/东莞seo代理

最近数码圈新机发布的少&#xff0c;但操作系统却打的火热。这边鸿蒙OS2.0刚刚公测&#xff0c;那边Android 12系统就正式登场了。谷歌正式发布Android 12(1)开放的系统风格与操作界面这么多年以来&#xff0c;国产手机用的基本上都是安卓系统&#xff0c;虽然它们在此基础上设…...

网站制作有哪些创新/百度权重查询

说实话&#xff0c;css用过不少&#xff0c;但是伪类与伪元素是啥意思呢&#xff1f;不复习真不知道用了那么多的: :;竟然就是伪类与伪元素的意思。来&#xff0c;跟我一起来复习下。 先来看看这张图片 CSS 选择器 种类如下 类型、类和ID选择器标签属性选择器运算符伪类与伪元…...

如何做一名优秀的网站管理者/品牌宣传推广方案

继上次开完“世界输送机大会之后”之后&#xff0c;这次再组织一次“世界托盘立体库大会”。这里我们只盘点一下自动化的托盘立体仓库。 照例&#xff0c;先百度百科一下什么是自动化立体仓库&#xff1a; 由百科上可以看到&#xff0c;立体仓库与普通仓库相比&#xff0c;一方…...

网站开发总监招聘/seo数据

题目链接 并查集是用来对集合合并查询的一种数据结构&#xff0c;或者判断是不是一个集合&#xff0c;本题是给你一系列区间和&#xff0c;判断给出的区间中有几个是不合法的。 思考&#xff1a; 1.如何建立区间之间的联系 2.如何发现悖论 首先是如何建立联系&#xff0c;我们…...

php源码建站 一品资源/手游推广平台代理

本文通过列举出一些常见的实例来分析Python3.0与2.X版本的区别&#xff0c;是作者经验的总结&#xff0c;对于Python程序设计人员来说有不错的参考价值。具体如下&#xff1a;做为一个前端开发的码农&#xff0c;最近通过阅读最新版的《A byte of Python》并与老版本的《A byte…...

做一个产品网站要多少钱/seo搜索排名优化公司

文章目录一、今日成绩二、错题总结第一题三、知识查缺题目及解析来源&#xff1a;2023年04月12日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 依据题目画出PERT图如下&#xff1a; 关键路径长度&#xff08;从起点到终点的路径中最长的一条&#x…...