C++关于拷贝构造函数的一些理解

定义:

拷贝构造函数是C++中的一种特殊的构造函数,用于创建一个对象的副本。它的作用是在对象之间进行拷贝初始化。拷贝构造函数通常以引用的方式接受同类型的对象作为参数,以完成对象的拷贝。程序中如果没有定义拷贝构造函数系统会生成一个默认的拷贝构造函数,它会将作为初始值的对象的数据成员的值都拷贝到要初始化的对象中。

注意:拷贝构造函数的形参通常建议使用引用类型,如果不使用引用类型,而是传递对象本身,会导致在函数调用时发生对象的拷贝,这样就会调用拷贝构造函数本身,导致无限循环。因此,为了避免这种情况,拷贝构造函数的形参一般建议使用引用类型

定义拷贝构造函数的形式是:
class 类名
{
public :
类名(形参); //构造函数
类名(类名 &对象名); //拷贝构造函数
...
};
类名::类(类名 &对象名) //拷贝构造函数的实现
{
函数体
}

使用场景:

拷贝构造函数在以下三种情况下会被调用:

1.当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。

int main()
{
Point A(1,2);
Point B(A); //拷贝构造函数被调用
cout<<B.GetX()<<endl;
return 0;
}


2.若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。例如:

void fun1(Point p)
{
cout<<p.GetX()<<endl;
}
int main()
{
Point A(1,2);
fun1(A); //调用拷贝构造函数
return 0;
}

3.当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:

Point fun2()
{
Point A(1,2);
return A; //调用拷贝构造函数
}
int main()
{
Point B;
B=fun2();
return 0;
}

最后这种情况怎么调用的拷贝构造函数呢?对象A 是局部对象,在fun2 函数执行完就释放了,那怎么将它拷贝给对象B
呢?编译器在执行B=fun2()时会创建一个临时的无名对象,在执行return A 时实际上是调用了拷贝构造函数将A 的值拷贝到
了临时对象中,A 就释放了,然后将临时对象的值再拷贝到对象B 中。

延伸:

在C#中,没有类似于C++的拷贝构造函数机制。C#中的对象赋值和参数传递都是通过引用进行的,而不是像C++中那样通过值传递。

我们来看一个例子来演示C#和C++在参数传递时是否会对传入实参产生影响:

C#代码:

using System;public class Example
{public int X { get; set; }
}public class Program
{public static void ModifyObject(Example obj){obj.X = 10; // 修改形参}public static void Main(string[] args){Example original = new Example();original.X = 5;ModifyObject(original); // 传递对象给函数Console.WriteLine(original.X); // 输出:10}
}

C++代码: 

#include <iostream>class Example {
public:int X;
};void ModifyObject(Example obj)
{obj.X = 10; // 修改形参
}int main()
{Example original;original.X = 5;ModifyObject(original); // 传递对象给函数std::cout << original.X << std::endl; // 输出:5return 0;
}

可以看出C#程序在对象 original 被传递给 ModifyObject 函数,虽然在函数内部修改了形参 obj 的属性值,但是原始对象 original 的属性值也被修改了。这是因为 objoriginal 实际上引用的是同一个对象。而C++程序虽然在 ModifyObject 函数中修改了形参 obj 的属性值,但是原始对象 original 的属性值没有受到影响。这是因为在调用 ModifyObject 函数时,发生了对象的复制,形参 obj 是原始对象的一个副本,对形参的修改不会影响原始对象。

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

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

相关文章

echarts 数据重新加载,原数据依然存在图表上

watch: {data: {deep: true,handler(val) {this.resizeHandler();this.initChart(); 主要是这步this.render(val);}}},监听数据是否真正变化了 在数据变化的时候在重新初始化图表实例对象。 // 初始化渲染initChart() {chart this.$echarts.init(this.$refs.myChart);this.r…

智能楼宇安防3D数据可视化平台满足日益增长的安防需求

在当今社会&#xff0c;安全是每个人和企业最为关心的问题。为满足日益增长的安防需求&#xff0c;3D可视化公司深圳华锐视点隆重推出安防平台3D可视化管理系统&#xff0c;以先进的三维技术为您的安全保驾护航。 安防平台3D可视化管理系统通过创新的三维可视化技术&#xff0c…

纷享销客BI智能分析平台技术架构介绍

纷享销客BI智能分析平台致力于降低用户上手门槛&#xff0c;无缝继承纷享销客PaaS平台的对象关系模型和权限体系&#xff0c;让使用纷享CRM的营销人员、销售人员、服务人员等各类角色人员都能够将分析场景与业务场景相融合&#xff0c;将数据思维融合到自己的日常工作、团队工作…

SpringCloud-面试篇(二十三)

&#xff08;1&#xff09;SpringCloud常见组件有那些 有无数微服务需要相互调用&#xff1a;可以用远程调用组件OpenFeign组件&#xff0c;也可以用Dobble 这么多微服务相互调用怎么管理&#xff1a;就用到注册中心组件Nacos&#xff0c;Eureka 所有的服务去找注册中心做注…

TCP协议与UDP协议区别

举个列子&#xff1a; 三次握手&#xff1a;为了解决网络信道不可靠的问题&#xff1b;防止客户端向服务端发送两次数据&#xff0c;客户端一直处于接收的状态。 四次挥手是一样的。当客户端提出关闭请求&#xff0c;服务端处于关闭等待状态&#xff0c;此时客户端可以发送数据…

PMP考试难吗?考试通过率有多少?

我们通常以考试的通过率来评判一个考试的难易程度。通常通过率达到60%以上&#xff0c;这个考试就不太难&#xff1b;达到80% &#xff0c;这个考试就是不难的。 PMP考试难吗&#xff1f; 不少想要考PMP的小伙伴都会有这样的疑惑&#xff0c;首先以PMP的含金量来说&#xff0…

矩阵相乘torch.einsum()

einsum 是 Einstein summation 的缩写&#xff0c;来源于爱因斯坦求和约定&#xff08;Einstein summation convention&#xff09;。这是物理学家阿尔伯特爱因斯坦引入的一种简便记号&#xff0c;用于描述张量运算&#xff0c;特别是涉及多维数组的运算。 示例1&#xff1a;矩…

深入理解Python中的*args和**kwargs参数

在Python世界里&#xff0c;*args和**kwargs是两个经常遭到新手困惑但又极富魅力的概念。今天&#xff0c;我们将一起探索它们的神秘面纱&#xff0c;了解如何在日常开发中利用这两个强大的工具来编写更加灵活和强大的代码。 *args&#xff1a;处理不定数量的位置参数 在Pyth…

产品推荐 | 基于Lattice USB3-GbE VIP IO技术赋能视频接口开发板

1、产品概述 支持视频接口平台 (VIP) – 为莱迪思VIP提供USB 3.0 和千兆以太网网络互连 灵活的快速原型设计和开发– 两个标准的高速连接器实现嵌入式视觉原型系统的简便快速硬件配置 可靠、经验证的即时使用设计– 莱迪思演示设计通过USB 3.0和工业千兆以太网接口实现快速视…

Linux C语言: 数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址&#xff08;类似门牌号&#xff09; • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

accelerate 笔记:梯度同步的时间效率

1 介绍 PyTorch 的分布式模块通过在系统中所有GPU之间进行来回通信来操作。 这种通信需要时间&#xff0c;并且确保所有进程了解彼此的状态在使用ddp模块时会在特定的触发点发生 这些触发点被添加到PyTorch模型中&#xff0c;特别是它们的 forward() 和 backward() 方法中当通…

2024-06-05 Android app jni里面c语言函数申请的局部变量数组过大会导致程序崩溃的问题分析

一、下面是一个app jni里面一个函数&#xff0c;函数里面定义一个数组&#xff0c;实际运行的时候发现数组过大的时候会导致app崩溃。 JNIEXPORT jint JNICALL JNI_FUNCTION(native_1getcapture_1data)(JNIEnv *env, jobject obj,jbyteArray des_data,jbyteArray src_data,jin…

Linux 多线程 生产者消费者 问题

在 Linux 系统中&#xff0c;生产者和消费者问题是一个经典的多线程同步问题&#xff0c;用于描述如何在多线程环境中协调多个线程对共享资源的访问。这个问题通常涉及两个类型的线程&#xff1a;生产者线程和消费者线程。生产者线程负责生成数据并将其放入缓冲区&#xff0c;而…

3D开发工具HOOPS助力PLM/PDM系统创新,高效实现复杂数据精细处理、3D模型交互可视化!

在现代制造和工程领域&#xff0c;PLM&#xff08;产品生命周期管理&#xff09;和PDM&#xff08;产品数据管理&#xff09;已成为企业优化流程和提升竞争力的关键工具。 随着技术的飞速发展&#xff0c;PLM和PDM应用程序需要更先进的工具来处理复杂的CAD数据、实现高效的3D可…

九泰智库-注册讲堂 | 浙江省eRPS系统上线后提交文件要求

浙械eRPS系统(https://ylqx.certca.cn/ylqxonline/)已正式上线启用。 在过渡期内&#xff0c;注册申请人需要同时进行线上医疗器械注册电子申报和提交纸质资料&#xff0c;以确保审评审批工作的顺利进行。过渡期结束时间另行通知。 以下是对电子申报资料格式要求的总结&#…

从零开始:如何通过美颜SDK构建自己的直播美颜工具

今天&#xff0c;我将详细介绍如何通过美颜SDK从零开始构建自己的直播美颜工具。 一、了解美颜SDK 什么是美颜SDK 开发者可以通过集成SDK&#xff0c;快速在应用中实现这些功能&#xff0c;而无需从头编写复杂的图像处理算法。 选择合适的美颜SDK 选择时可以根据以下几个方…

南京观海微电子-----555函数信号发生器电路分析

电路图 整个电路的工作过程&#xff1a; 首先&#xff0c;555芯片通过外围电阻电容组成一个多谐振荡器&#xff0c;输出一个方波。 555多谐振荡器输出方波后&#xff0c;经电容C1耦合到由R3&#xff0c;C3组成的积分网络。输出三角波。这也是一个电容充放电的过程&#xff0c…

第44集《摄大乘论》

请大家打开《讲义》第一四三页&#xff0c;我们看第一行的地方&#xff1a; 庚一、地前位 谓此菩萨&#xff0c;不着财位&#xff0c;不犯尸罗&#xff0c;于苦无动&#xff0c;于修无懈。于如是等散动因中不现行时&#xff0c;心专一境&#xff0c;便能如理简择诸法&#xf…

学生问的一道CSS3媒体查询,实现响应式设计的题

目录 题目要求&#xff1a; 解题思路&#xff1a; 解题&#xff1a; 1&#xff09;大屏、3个DIV水平排列 2&#xff09;中屏、前2个DIV水平占一半&#xff0c;第三个另起一行&#xff0c;宽度占满 3&#xff09;小屏&#xff0c;3个DIV铺满&#xff0c;垂直排列 题目要求&…

2024年端午节放假通知

致尊敬的客户以及全体同仁&#xff1a; 2024年端午节将至&#xff0c;根据国务院办公厅通知精神&#xff0c;结合公司的实际情况&#xff0c;现将放假事宜通知如下&#xff1a; 2024年6月8日&#xff08;星期六&#xff09;至6月10日&#xff08;星期一&#xff09;&#xff…