C++拷贝构造函数(深拷贝,浅拷贝)

C++类的拷贝(复制)构造函数深入理解 拷贝构造函数的基本使用以及更深入的理解 阅读详情

对于普通类型的对象来说,它们之间的复制是很简单的,例如:
int a=88;
int b=a; 
而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 

#include <iostream>
using namespace std;

class CExample {
private:
     
int a;
public:
     CExample(
int b)
     
{ a=b;}
     
void Show ()
     
{
        cout
<<a<<endl;
    }

}
;

int main()
{
     CExample A(
100);
     CExample B
=A;
     B.Show ();
     
return 0;
}
 

运行程序,屏幕输出100。从以上代码的运行结果可以看出,系统为对象B分配了内存并完成了与对象A的复制过程。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。下面举例说明拷贝构造函数的工作过程。

#include <iostream>
using namespace std;

class CExample {
private:
    
int a;
public:
    CExample(
int b)
    
{ a=b;}
    
    CExample(
const CExample& C)
    
{
        a
=C.a;
    }

    
void Show ()
    
{
        cout
<<a<<endl;
    }

}
;

int main()
{
    CExample A(
100);
    CExample B
=A;
    B.Show ();
    
return 0;
}
 

CExample(const CExample& C)就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型,不可变的。例如:类X的拷贝构造函数的形式为X(X& x)。

当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
一个对象以值传递的方式传入函数体 
一个对象以值传递的方式从函数返回 
一个对象需要通过另外一个对象进行初始化。

如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝,后面将进行说明。

自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。

浅拷贝和深拷贝

  在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。

  深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。下面举个深拷贝的例子。

#include <iostream>
using namespace std;
class CA
{
 public:
  CA(int b,char* cstr)
  {
   a=b;
   str=new char[b];
   strcpy(str,cstr);
  }
  CA(const CA& C)
  {
   a=C.a;
   str=new char[a]; //深拷贝
   if(str!=0)
    strcpy(str,C.str);
  }
  void Show()
  {
   cout<<str<<endl;
  }
  ~CA()
  {
   delete str;
  }
 private:
  int a;
  char *str;
};

int main()
{
 CA A(10,"Hello!");
 CA B=A;
 B.Show();
 return 0;
} 

深拷贝和浅拷贝的定义可以简单理解成:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,反之对象存在资源,但复制过程并未复制资源的情况视为浅拷贝。

浅拷贝资源后在释放资源的时候会产生资源归属不清的情况导致程序运行出错。

        Test(Test &c_t)是自定义的拷贝构造函数,拷贝构造函数的名称必须与类名称一致,函数的形式参数是本类型的一个引用变量,且必须是引用。

当用一个已经初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用,如果你没有自定义拷贝构造函数的时候,系统将会提供给一个默认的拷贝构造函数来完成这个过程,上面代码的复制核心语句就是通过Test(Test &c_t)拷贝构造函数内的p1=c_t.p1;语句完成的。

C++中set使用及介绍(超详细+入门+代码解析) C+帮助文档:链接:Set的文档介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。 阅读详情

相关推荐

实战c++中的vector系列--copy set to vector(别混淆了reserve和resize)

stl算法中有个copy函数,我们可以轻松的写出这样的代码:#include <iostream> #include <algorithm> #include <vector> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { double darray[10]={1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,

一蓑烟雨任平生 也无风雨也无晴 1万+

C++学习笔记 类的对象的复制

VC驿站: C++ 零基础入门到完全独立开发 合集_哔哩哔哩_bilibili

qq_39021972的博客 1038

C++拷贝构造函数详解:浅拷贝与深拷贝

拷贝构造函数是面向对象编程中的一个基础概念,其主要作用是实现对象之间的复制。具体来说,拷贝构造函数是一种特殊的构造函数,当新对象需要初始化为一个已存在对象的副本时,拷贝构造函数就会被调用。它确保新创建的对象能够准确地反映出原对象的状态。浅拷贝在C++编程中是一个常见的话题,它涉及到对象间的复制行为,尤其是指针成员变量的复制。这种复制方式只复制指针本身,而不复制指针所指向的数据。

weixin_31749299的博客 819

c++中的拷贝构造函数,浅拷贝,深拷贝

c++拷贝构造函数,深拷贝和浅拷贝

cyz322649的博客 1621

iOS逆向实战:绕过SSL Pinning抓取ChatGPT设备令牌

在移动应用安全与网络协议分析领域,中间人攻击是一种核心的流量拦截与分析技术。其原理是在客户端与服务器之间插入一个代理节点,通过伪造数字证书来解密和窥探HTTPS加密流量。这项技术的工程价值在于,它使开发者能够调试API、分析通信协议以及实现自动化集成。然而,许多高安全要求的应用(如金融、社交类App)会采用SSL Pinning(证书绑定)技术来抵御此类攻击,这为逆向工程带来了挑战。本文聚焦于一个具体的应用场景:如何针对启用了SSL Pinning的ChatGPT iOS客户端,通过特定的工具链(如Trol

weixin_28235889的博客 977

vllm运行过程中出现cuda out of memory

将长序列分解为多个小块,每个块分别处理。这样可以减少单次 Prefill 的计算量和显存占用,从而优化 TTFT 和显存使用效率。考虑使用 CPU 卸载(如 --cpu-offload-gb),将部分缓存卸载到 CPU 内存中,扩展 GPU 的虚拟内存。在大语言模型中,当输入序列很长(例如超过 1024 个 Token)时,Prefill 阶段的计算量会非常大。最后增加了enable-chunked-prefill参数和max_num_batched_tokens解决了问题。参数来进一步优化性能。

盛世芳华 3517

C++ 拷贝构造函数 浅拷贝 深拷贝

拷贝构造函数的​​参数为本类对象的常量引用​​,格式为 ClassName(const ClassName &src)。若未显式定义,​​编译器会自动生成默认拷贝构造函数​​,执行​​浅拷贝​​(逐成员复制值)。

fukaiqiang 1425

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 446

C++拷贝构造函数:深拷贝和浅拷贝

1 拷贝构造函数 它是一种特殊的构造函数,由编译器调用来完成一些基于同一类的其他对象的构件及初始化。 1.1 拷贝函数的调用场景: 1、值传递传递函数体 2、值传递从函数体返回(返回匿名对象) 3、用一个对象初始化另一个对象 1.2 举例说明 1、值传递传递函数体 #include <iostream> using namespace std; public: int a; Test(int x){ a=x; } Test(...

奔跑的小仙女 5480

最速下降法、牛顿法、拟牛顿法,Python实现高维二次目标函数优化

原理什么的就不说了,只有代码。。。 十元二次目标函数,求极小值点。 1.最速下降法 import random import numpy as np import matplotlib.pyplot as plt from sympy import * def goldsteinsearch(f, df, d, x, alpham, rho, t): flag = 0 a = 0 b = alpham fk = f(x) gk = df(x)

我乐飞的技术博客 2244

FAST-LIO 实战:从 LI-Init 标定到 YAML 配置全解析

本文详细解析了FAST-LIO算法中LI-Init标定的关键步骤与YAML配置优化技巧。从激光雷达与IMU的时空标定原理到实战参数调优,提供了一套完整的解决方案,帮助开发者解决点云畸变、建图漂移等常见问题,提升SLAM系统在动态环境中的稳定性和精度。

weixin_42651281的博客 329

[C++] 拷贝构造函数 && 深拷贝、浅拷贝

说明:在C++中,拷贝构造函数是一个特殊的构造函数,它用于创建一个新对象,这个新对象是另一个同类型对象的副本。拷贝构造函数通常接受一个参数,这个参数是对另一个对象的引用,并且这个引用是一个常量引用,以确保不会通过拷贝构造函数修改原始对象的状态。这里的MyClass是类的名称,other是传递给拷贝构造函数的常量引用参数,表示要拷贝的对象。拷贝构造函数的主要作用主要有3个,包括:创建对象副本:当你需要根据一个已存在的对象创建一个新的对象时,拷贝构造函数非常有用。

wangdsh的博客 1724

【ZYNQ】OV5640 图像采集与显示

OV5640 是豪威(OmniVision)半导体公司推出的高性能的 CMOS 数字图像传感器,支持最高 500 万像素图像采集,支持 RAW RGB、RGB565、YCbCr422 等图像格式输出,可应用于手机、平板等电子设备。本文主要介绍如何使用 Zynq 驱动 OV5640 摄像头进行图像采集,并通过 HDMI 实时显示。

洋洋Young的博客 1433

【C++拷贝构造函数、深拷贝和浅拷贝】

本文介绍了C++拷贝构造函数、深拷贝和浅拷贝的概念、语法以及实际应用场景。拷贝构造函数用于创建对象的副本,深拷贝和浅拷贝涉及到对象的内存管理方式。

武帝为此的博客 313

企业数字化转型解决方案架构设计:一个五维全景视角

本文系统探讨了企业数字化转型的架构设计框架,提出五维协同模型:企业架构作为战略罗盘,业务架构聚焦价值创造,应用架构实现能力载体,数据架构提供智能燃料,技术架构奠定基础支撑。文章深入分析了各架构域的核心要素、设计原则及相互关系,并指出数字化转型需通过渐进路径,结合战略引领、技术赋能和组织变革,构建有机统一的架构体系。该框架为企业应对数字化复杂性提供了系统性方法论,强调从整体视角实现技术与业务的深度融合。

金牌架构师 1256

YOLOv11改进 | Neck篇 | 双向特征金字塔网络BiFPN助力YOLOv11有效涨点

本文给大家带来的改进机制是BiFPN双向特征金字塔网络,其是一种特征融合层的结构,也就是我们本文改进YOLOv11模型中的Neck部分,它的主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。本文给大家带来的结构可以让大家自行调节网络结构大小,同时能够达到一定的轻量化效果,为什么发BiFPN呢因为它算是YOLO系列改进中的常青树了,大家可以借鉴它的双向特征思想来创新自己的Neck结构本文的BiFPN通过yaml文件配置可以让大家自行调配其结构。

Snu77的博客 9105

C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)

这意味着拷贝后的对象和原始对象共享同一块内存,当其中一个对象修改了内存中的值时,另一个对象也会受到影响。然而,当一个类拥有指针或引用等需要特别注意的成员变量时,编译器生成的默认拷贝构造函数不能保证正确的深拷贝,会导致浅拷贝问题和内存泄漏等问题。需要特别注意的是,如果类中包含指针或资源管理的成员变量(如动态分配的内存),则需要手动实现深拷贝以确保正确的对象复制和资源释放。因此,当类中存在指针或资源管理的成员变量时,通常需要自定义拷贝构造函数和赋值运算符,以实现深拷贝,避免出现潜在的问题。

Srlua的博客 2894

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c++拷贝构造函数(深拷贝,浅拷贝)详解

一、什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a;     而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。  下面看一个类对象拷贝的简单例子。    #include&lt;iostream&gt; using namespace std; class CExa...

weixin_34304013的博客 2344

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

42.C++拷贝构造函数以及深拷贝浅拷贝

在C++中,拷贝构造函数(Copy Constructor)是一种特殊的构造函数,用于创建一个新对象并将其初始化为与现有对象相同的副本。拷贝构造函数通常用于以下情况:当使用一个对象来初始化另一个对象时。当将对象作为函数参数按值传递时。当从函数返回对象时。拷贝构造函数的参数是一个常引用(const reference),参数名通常是other或source等表示源对象的名称。在拷贝构造函数内部,你需要根据需要将源对象的成员变量拷贝到新对象中。可以使用其他构造函数或直接对成员变量进行赋值操作。

weixin_63779802的博客 901

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++拷贝构造函数:浅拷贝与深拷贝

在介绍C++浅拷贝与深拷贝之前,我们先引出C++的拷贝构造函数。   C++拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用。用于在建立一个新的对象时,使用一个已经存在的对象来初始化这个新对象。因为拷贝构造函数时特殊的构造函数,所以其没有返回值类型,且名称与类名相同;该函数只有一个参数,即此类对象的引用;所有类都必须有一个拷贝构造函数,如果没有自动以拷贝构造函数,系统会自动产生一个默认拷贝构造函数。   自定义拷贝构造函数的一般形式为:     类名::类名(const 类名& 对象名

xiaoyaGrace的博客 382

C++中的拷贝构造函数(复制构造函数)以及涉及的深拷贝和浅拷贝问题

C++中的拷贝构造函数以及深浅拷贝。

m0_73968399的博客 2857

C++中拷贝构造函数的深拷贝和浅拷贝

什么是拷贝构造函数及拷贝构造函数的应用? 什么是拷贝构造函数 每个类都有6个默认成员函数(构造函数,析构函数,拷贝构造函数,赋值重载函数,取地址运算符重载函数,const修饰的取地址运算符重载函数) 也就是说即使你创建一个空类,也会存在这6个函数 其中构造函数只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰) 在用已存在的类类型对象创建新对象时由编译器自动调用 class sol...

weixin_44456232的博客 459
上一篇: [C++再学习系列] STL容器删除操作总结
下一篇: 运算符
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值