C++拷贝构造函数

news/2024/11/16 3:16:02/

文章目录


拷贝构造函数是一个c++的默认成员函数,它是用来拷贝对象的,当你想修改对象,但是又不想修改它本身,那么可以将其拷贝给一个对象对这个拷贝出来的对象进行操作
拷贝构造函数语法:类名(const 类名&类对象)以日期类为例:Date(const Date& d)
拷贝构造函数特征:

它是构造函数的一种重载形式:它只有一个显示参数,并且是类对象的引用

不是引用是完全行不通的,为啥?
因为函数在调用时,要先传参数,对于参数是内置类型,他没啥要求就是直接实参拷贝给形参,对于形参是自定义类型在函数调用时,参数传递会先调用它的拷贝构造,然后再执行改函数功能!
以d1做实参,调用fun函数,传参会先调用它的拷贝构造
在这里插入图片描述

在这里插入图片描述
调试观察!
如果参数不是引用,如果编译器不坚持那么就会一直调用下去
在这里插入图片描述
因为它的形参是自定义类型,相当于每次都是新定义的一个对象!而引用就是他自己的别名,他不是将一个对象的值给另一个对象!
拷贝构造函数因其是默认成员函数,那么当他没有被显示定义时,编译器也会自动生成的
只是它同构造函数对于内置类型成员变量的处理不同,构造函数是不处理内置成员变量的,拷贝构造函数会将值依次按字节拷贝给另一个对象!但是对于自定义类型的,它会去调用自己的拷贝构造函数
在这里插入图片描述
这里是没有写出它的拷贝构造函数的。
当自定义类型成员,它会去调用它的拷贝构造,那么如果这个拷贝构造并没有写出,它会自动生成且依次拷贝,就拿栈来说,若是动态申请的数组都按字节拷贝的话,两个栈会同时指向一块空间,那么当其中一个栈析构之后,另外一个也会对同一块空间再次析构依次,同一块空间是不能析构两次的额!并且当一个栈的改变会影响到另一个栈。这样于本意不符!而是要重新开与原栈相同的空间,然后按字节依次拷贝过去,这样就各自在各自空间,不用再担心析构两次的问题,这样为深拷贝,按值拷贝为浅拷贝!


http://www.ppmy.cn/news/470626.html

相关文章

Jetpack Compose Material3 组件之 DatePicker(日期选择)

前言 在之前我使用 Comose 写 APP 的时候,官方还没有给出关于 DatePicker 的解决方案。 当时为了在 Compose 中实现 DatePicker ,大致有两种方案: 一是使用原生 VIew 的 DatePicker,但是因为觉得我即然都用 Compose 了&#xf…

拉普拉斯方程解决有介质导体球壳问题

一个内径和外径分别为和的导体球壳,带电荷,同心地包围着一个的导体球,使这个导体球接地,求空间各点的电势和这个导体球的感应电荷 我们不难发现,球对称性非常强,电势只和半径有关系 所以我们可以假设电势为…

CVPR2022 多目标跟踪(MOT)汇总-补充篇

为该文章的后续补充https://blog.csdn.net/qq_34919792/article/details/124343166 七、《Multi-Object Tracking Meets Moving UAV》 作者: Shuai Liu†1, Xin Li†2, Huchuan Lu1,2, You He∗3 1Dalian University of Technology, 2Peng Cheng Laboratory, 3Naval Aeronaut…

家用洗地机好用吗?值得推荐的家用洗地机

谁说家务苦差事?现在有了洗地机,家庭清洁变得更加简单、快捷、干净,让您轻松应对家庭日常清洁的要求。洗地机采用先进的技术,自动感应地面脏污,智能调节出水量和吸力,不仅能够保持地面清洁,更能…

软考高级系统架构设计师(二) 基础知识之计算机组成与系统结构

目录 概要 计算机组成结构 CPU组成 冯诺依曼结构 存储系统-层次化存储结构 高速缓冲存储器cache 主存编址计算 磁盘管理 磁盘管理算法 先来先服务(FCFS): 最短寻道时间优先(SSTF) 扫描算法(电梯调度…

性能测试需求分析和学习

在实际的工作中系统的性能需求通常是一个笼统的需求,而且有可能给提需求的人并不知道具体的性能需要,所以只能含糊的列出。如果测试人员不搞清楚,就会出现实际要把杀猪刀,需求标明能屠龙!!! 下…

基于webpack开发react-cli

在前面的章节中我们学习了webpack的基础配置(五大核心属性),以及一些高级优化配置(source map、Tree Shaking、 HMR、Code Split等),并且分别开发了webpack.dev.js(开发环境配置),和webpack.pro…

代码随想录二刷 617. 合并二叉树654. 最大二叉树

617. 合并二叉树 代码如下 func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode { if root1 nil { return root2 } if root2 nil { return root1 } root1.Val root2.Val 用前序遍历将root2的值和root1相加 root1.Left mergeTrees(root1.Left,root2.Left) …