您好,欢迎来到99网。
搜索
您的当前位置:首页[C++]C++浅拷贝与深拷贝

[C++]C++浅拷贝与深拷贝

来源:99网


前言

C++中有两种拷贝:深拷贝和浅拷贝

要是想要运用好拷贝函数就必须清楚深拷贝与浅拷贝的区别

一、区别

二、浅拷贝

1.简单描述

       同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是的两个对象,这种情况被称为浅拷贝.

        一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。

2.代码实例

无自己构造的拷贝函数即无深拷贝构造函数:

析构函数是用来检验浅拷贝不能简单拷贝指针指向的堆区空间内容。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;
class Person
{
    public:
        Person()
        {}
        //初始化属性
        Person(const char* name, int age)
        {
            Name = (char*)malloc(strlen(name) + 1);
           
        } 
        //拷贝构造 系统会提供默认拷贝构造,而且是简单的值的拷贝即浅拷贝
        
        //析构调用
        ~Person()
        {
            cout << "析构函数的调用" << endl;
            if (Name != NULL)
            {
                free(Name);
                Name = NULL;
            }
        }
           
           
            //姓名
            char* Name;
            //年龄
            int Age;
       
};
void test01()
{
    Person p1("光头强", 10);
    Person p2(p1);//调用拷贝构造
}
        

int main(void)
{
    test01();
    system("pause");
    return 0;
}

 运行结果会崩掉,原因就是:系统会提供一个默认的简单值的拷贝即浅拷贝,实例代码中的p1.Age会被正常拷贝(浅拷贝),而指针p1对象中的*Name和(浅)拷贝p1后的p2中的*Name指向同一个堆区空间,因此析构函数会析构两回这个同一堆区空间而崩溃。p1对象中的Age进行拷贝是浅拷贝,p1对象中的指针*Name进行拷贝是深拷贝。
见下图:(指针指向同一堆区空间)

三.深拷贝

1.简单描述

       当类中有指针,并且此指针有动态分配空间,析构函数做了释放处理,往往需要自定义拷贝构造函数,自行给指针动态分配空间,深拷贝。

2.代码实例

上述示例代码加上拷贝构造函数即可实现深拷贝:

//增加拷贝构造函数  深拷贝
        Person(const Person& p)
        {
         Age = p.Age;
         Name = (char*)malloc(strlen(p.Name) + 1);//新建一个堆区空间
         strcpy(Name, p.Name);
        }

见下图:(深拷贝新建了一个堆区空间) 

运行结果是进行两次析构


 四.完整代码

深拷贝与浅拷贝的实现

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;
class Person
{
    public:
        Person()
        {}
        //初始化属性
        Person(const char* name, int age)
        {
            Name = (char*)malloc(strlen(name) + 1);
           
        } 
        //拷贝构造 系统会提供默认拷贝构造,而且是简单的值的拷贝即浅拷贝
        //增加拷贝构造函数
        Person(const Person& p)
        {
         Age = p.Age;
         Name = (char*)malloc(strlen(p.Name) + 1);
         strcpy(Name, p.Name);
        }
        //析构调用
        ~Person()
        {
            cout << "析构函数的调用" << endl;
            if (Name != NULL)
            {
                free(Name);
                Name = NULL;
            }
        }
           
           
            //姓名
            char* Name;
            //年龄
            int Age;
       
};
void test01()
{
    Person p1("光头强", 10);
    Person p2(p1);//调用拷贝构造
}
        

int main(void)
{
    test01();
    system("pause");
    return 0;
}


五.运行结果

总结

深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,深拷贝的实现需要构造拷贝函数新建一个堆区空间在进行拷贝,浅拷贝直接拷贝即可(简单的值的拷贝)。

 

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务