zoukankan      html  css  js  c++  java
  • c++——深拷贝和浅拷贝

    深拷贝和浅拷贝

    • 默认复制构造函数可以完成对象的数据成员值简单的复制
    • 浅拷贝只拷贝指针的地址值,不拷贝地址所指向的数

    1浅拷贝问题

    1、c++默认的拷贝构造函数

    2、=号操作符

    都是浅拷贝

    2浅拷贝程序C++提供的解决方法

    自己手动编写拷贝构造函数(使用深拷贝),不使用c++默认的拷贝构造函数。

    显示提供copy构造函数

    显示操作重载=号操作,不使用编译器提供的浅copy

    class Name

    {

    public:

             Name(const char *pname)

             {

                       size = strlen(pname);

                       pName = (char *)malloc(size + 1);

                       strcpy(pName, pname);

             }

             Name(const Name &obj)

             {

                       //用obj来初始化自己

                       pName = (char *)malloc(obj.size + 1);

                       strcpy(pName, obj.pName);

                       size = obj.size;

             }

             ~Name()

             {

                       cout<<"开始析构"<<endl;

                       if (pName!=NULL)

                       {

                                free(pName);

                                pName = NULL;

                                size = 0;

                       }

             }

             void operator=(Name &obj3)

             {

                       if (pName != NULL)

                       {

                                free(pName);

                                pName = NULL;

                                size = 0;

                       }

                       cout<<"测试有没有调用我。。。。"<<endl;

                       //用obj3来=自己

                       pName = (char *)malloc(obj3.size + 1);

                       strcpy(pName, obj3.pName);

                       size = obj3.size;

             } 

    protected:

    private:

             char *pName;

             int size;

    };

    //对象的初始化 和 对象之间=号操作是两个不同的概念

    void playObj()

    {

             Name obj1("obj1.....");

             Name obj2 = obj1; //obj2创建并初始化

             Name obj3("obj3...");

             //重载=号操作符

             obj2 = obj3; //=号操作

             cout<<"业务操作。。。5000"<<endl;

    }

    void main61()

    {

             playObj();

             system("pause");

    }

     
     
  • 相关阅读:
    Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)
    Java实现蓝桥杯勇者斗恶龙
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 224 基本计算器
    Java实现 LeetCode 224 基本计算器
  • 原文地址:https://www.cnblogs.com/long5683/p/9775120.html
Copyright © 2011-2022 走看看