zoukankan      html  css  js  c++  java
  • 学习:类和对象——深拷贝和浅拷贝

    深拷贝和浅拷贝:

    浅拷贝:简单的赋值拷贝操作

    深拷贝:在堆区重新申请空间,进行拷贝操作

    深拷贝就是为了解决浅拷贝带来的问题而产生的

    浅拷贝:

    大家先看下这段代码:

    #include<iostream>
    #include<string>
    
    using namespace std;
    
    class Person {
    
    public:
    
    	Person() {
    		cout << "这是无参构造函数" << endl;
    	}
    		
    	Person(int age, int height) {
    		cout << "这是有参构造函数" << endl;
    		this->my_Age = age;
    		this->my_height = new int(height);
    	}
    	
    	~Person() {
    		if (this->my_height != NULL) {
    			delete my_height;
    			my_height = NULL;
    		}
    		cout << "这是析构函数" << endl;
    	}
    
    public:
    	int my_Age;
    	int * my_height;
    };
    
    void test01() {
    	Person p1(18,160); //进行有参构造函数
    	Person p2(p1); //进行拷贝构造函数
    	cout << "p1的年龄为 " << p1.my_Age << ", p1的身高为 " << *(p1.my_height) << endl;
    	cout << "p2的年龄为 " << p2.my_Age << ", p2的身高为 " << *(p2.my_height) << endl;
    
    }
    
    int main() {
    	test01();
    	
    	system("pause");
    	return 0;
    }
    

    大家会发现以上的代码运行的时候会报错,原因就在于析构函数的时候,p2执行完就会把* my_height所指向的内存空间进行释放,这样的后果就会导致当p1执行释放的时候找不到内存空间而造成报错,这时候深拷贝就可以帮助我们解决这种浅拷贝的问题,在我的理解中,浅拷贝的意思可以理解为,默认的拷贝函数函数复制相同的给之后的接收对象,所有的都相同,但是不免会引起类似争夺的问题,在这里'争夺'就可以理解为内存的释放。

    所以深拷贝就出来了,我们可以通过定义拷贝函数在栈区生成一个新的空间给 接收对象的属性的指针。

    修改代码如下:自己定义个拷贝函数就可以了

    Person(const Person& p) { //定义拷贝函数
        this->my_Age = p.my_Age; //默认的拷贝函数,我们这边自己定义也要加上
        //this->my_height = p.my_height; //默认的拷贝函数,我们这边需要重写,所以这条注释
        this->my_height = new int(*(p.my_height)); //让我们的my_height存一个全新的栈区的地址
    }
    
  • 相关阅读:
    Python全栈day10(基础知识练习题)
    Python全栈day10(基本数据类型及其常用方法)
    Python全栈day10(运算符)
    CentOS 添加常用 yum 源(转)
    CentOS yum源设定使用方法的整理(转)
    centos6.6安装php5.3.3(2015/3/4)
    centos6.6升级安装MySQL5.5(2015/3/4)
    vi/vim显示中文字符并且去掉^M的方法
    ecmall2.3.0 前后台样式等无效,导致前台页面显示不正常问题解决
    ecmall页面空白解决方案(转)
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/11863202.html
Copyright © 2011-2022 走看看