首页 > 其他分享 >11深拷贝与浅拷贝

11深拷贝与浅拷贝

时间:2024-01-16 10:46:43浏览次数:32  
标签:11 seqStack int pstack 拷贝 构造函数 size

深拷贝和浅拷贝

  • 没有提供任何构造函数的时候,系统默认生成构造和析构函数。
  • 当需要使用拷贝构造函数是,系统默认生成拷贝构造函数,是内存拷贝。
class seqStack {
private:
	int* _pstack;
	int _size;
	int _top;

public:
	seqStack(int size) {
		_size = size;
		_pstack = new int[size];
		_top = -1;
	}
	~seqStack() {
		delete[]_pstack;
		_pstack = nullptr;
	}
};

int main() {
	seqStack s1(10);
	seqStack s2 = s1; // 默认拷贝构造,属于内存拷贝,是一种浅拷贝。
    //析构顺序与构造顺序相反,先析构s2,delete了栈空间,s1析构再次释放栈空间会报错。
}
  • 对象如果占用外部资源,浅拷贝会出现问题,应转为深拷贝。
  • 深拷贝:不仅做内存拷贝,还做外部资源的内容拷贝。
class seqStack {
// private:
// 	int* _pstack;
// 	int _size;
// 	int _top;

public:
	seqStack(int size) {
		_size = size;
		_pstack = new int[size];
		_top = -1;
	}
	~seqStack() {
		delete[]_pstack;
		_pstack = nullptr;
	}
    //自定义拷贝构造函数
	seqStack(const seqStack &seq) {
		_pstack = new int[seq._size];
		for (int i = 0; i <= seq._top; i++) {
			_pstack[i] = seq._pstack[i]; 
		}
		_size = seq._size;
		_top = seq._top;
	}
    //重载等号运算符
    //如果需要支持连续赋值,重载等号运算符函数应为seqStack类型,返回*this
    void operator=(const seqStack& seq) {
        if (this == &seq)  //防止自赋值
	        return;
        delete[] _pstack;
        _pstack = new int[seq._size];
        for (int i = 0; i <= seq._top; i++) {
            _pstack[i] = seq._pstack[i];
        }
        _size = seq._size;
        _top = seq._top;
    }
};

int main() {
	seqStack s1(10);
	seqStack s2(s1); //调用拷贝构造函数
    seqStack s3 = s1; //调用拷贝构造函数
    //默认的等号运算符是内存拷贝,浅拷贝
    s3 = s1;// //已经不是初始化阶段了,重载等号运算符
}

标签:11,seqStack,int,pstack,拷贝,构造函数,size
From: https://www.cnblogs.com/sio2zyh/p/17967087

相关文章

  • 1月11日总结
    在最近的开发中,一星期内遇到了两个类似的需求:返回组装好的部门树、返回组装好的地区信息树,最终都需要返回List集合对象给前端。于是在经过需求分析和探索实践后,我对于这种基于Stream和List结构的父、子树形结构的操作有了新的认识,现在拿出来和大家作分享交流。一般来说完......
  • stm32笔记[11]-驱动SSD1306屏幕
    摘要在蓝桥杯物联网的CT127C开发板上驱动SSD1306的0.91寸显示屏.平台信息KeilMDK-ARM(μVision)V5.35.0.0STM32CubeMX6.2.1原理简介CT127C开发板简介蓝桥物联网竞赛实训装置省赛训练套装,适用于蓝桥杯大赛(电子类)物联网设计与开发科目竞赛训练及高校日常教学实训环......
  • 2024省选联测11
    A.Giao徽的烤鸭给定一棵树,边权为\(1\)。在第\(i\)家店办卡花费\(w_i\)元。对于任意一家店,如果Giao徽在到\(i\)的距离小于等于\(p\)的所有店办了卡,可得到\(v_p\)元的代金券。求最大利润。\(f_{u,i}\)表示在以\(u\)为根的子树中,到\(u\)距离小于等于\(i\)......
  • webpack,babel配置项目适配IE11
    package.json"browserslist":["ie11"] webpack.config.jsconstpath=require('path')consthtmlWebpackPlugin=require('html-webpack-plugin')const{CleanWebpackPlugin}=require('clean-webpack-......
  • 独立开发者碎碎念 1115
    关于心态❤在巨大焦虑的心态下,人都来不及生病。我记忆中,高考前神经高度紧张,高考后一场大病如期而至。人啊,真复杂。心态啊,真正能做到面对任何事客观平常心的,有几个呢因此尽可能保持客观平常心面对,想到最糟糕的结局和处理方式吧关于目标......
  • 吴师兄学算法day07 11. 盛最多水的容器
    题目:11. 盛最多水的容器难点:如何确定,每次只移动最短边,因为无论移动哪边的柱子,下面的底部一定是缩短的,剩下的就是取决于高度。如果移动的是,两侧高的那个,整体的面积一定是缩小的。如果移动的是,两侧底的那个,后面的柱子有可能是遇到高的,也有可能是低的,所以,整体面积可能大,也可......
  • P1145 约瑟夫
    题目链接:考虑使用循环链表来维护该环形数据结构。但下列代码只能通过70/100#include<bits/stdc++.h>usingnamespacestd;intne[50];intmain(){ intk,n,m; boolflag=true; cin>>k; n=2*k,m=k+1; for(inti=1;i<n;i++)ne[i]=i+1;......
  • 11.10
    《程序员的修炼之道:从小工到专家》的第三章节主要探讨了“技术深度与广度”的问题。这一章节强调了技术深度和广度对于程序员的重要性,以及如何在这两个方面取得平衡。首先,作者指出技术深度是程序员的核心竞争力。只有深入理解某个领域的技术,才能更好地解决相关问题。因此,程序员需......
  • 11.8
    《代码大全2》是一本非常经典的软件开发书籍。在书中,强调了比较优秀的代码结构和命名规范的重要性。书中注释的部分帮助我理解怎么去编写有意义的注释,合适的注释可以提供代码理解上的便利,但是过多或者无关的注释会干扰代码的可读性。还有书中关于代码复用和模块化的内容帮助学习......
  • 11.15
    语法说明如下:1)过程名存储过程的名称,默认在当前数据库中创建。若需要在特定数据库中创建存储过程,则要在名称前面加上数据库的名称,即db_name.sp_name。需要注意的是,名称应当尽量避免选取与MySQL内置函数相同的名称,否则会发生错误。2)过程参数存储过程的参数列表。其中,<参数名......