zoukankan      html  css  js  c++  java
  • C++基础——深拷贝,浅拷贝,智能指针

    1.浅拷贝

      简单的赋值拷贝操作

     

      

    2.深拷贝

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

      

    class Person {
    public:
        //无参(默认)构造函数
        Person() {
            cout << "无参构造函数!" << endl;
        }
        //有参构造函数
        Person(int age ,int height) {
            
            cout << "有参构造函数!" << endl;
    
            m_age = age;
            m_height = new int(height);
            
        }
        //拷贝构造函数  
        Person(const Person& p) {
            cout << "拷贝构造函数!" << endl;
            //如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
            m_age = p.m_age;
            m_height = new int(*p.m_height);
            
        }
    
        //析构函数
        ~Person() {
            cout << "析构函数!" << endl;
            if (m_height != NULL)
            {
                delete m_height;
            }
        }
    public:
        int m_age;
        int* m_height;
    };
    
    void test01()
    {
        Person p1(18, 180);
    
        Person p2(p1);
    
        cout << "p1的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;
    
        cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }

    3.智能指针

    #pragma once
    class Smart_ptr
    {
        friend class ChasPtr;
    
    private:
        int* ip;
        size_t use;    //计数
        Smart_ptr(int *p):ip(p),use(1){}
        ~Smart_ptr()
        {
            delete ip;
        }
    };
    
    class ChasPtr {
    
    
    
    public:
    
        ChasPtr(int *p,int i):ptr(new Smart_ptr(p)),val(i){}
    
        ChasPtr(const ChasPtr& orig) :ptr(orig.ptr), val(orig.val)
        {
            ++ptr->use;
        }
        int* get_ptr()const { return ptr->ip; };
        int get_int()const { return val; }
    
        void set_ptr(int* p) { ptr->ip = p; };
        void set_int(int i) { val = i; };
    
        int get_ptr_val()const { return *ptr->ip; };
        void set_ptr_val(int val)const { *ptr->ip = val; };
    
    
    
        ChasPtr& operator=(const ChasPtr&);
    
        ~ChasPtr()
        {
            if (ptr->use-- == 0) delete ptr;
        }
    
    private:
        //int* ptr;
        Smart_ptr* ptr;
        int val;
    };
    
    ChasPtr& ChasPtr::operator=(const ChasPtr&rhs)
    {
        ++rhs.ptr->use;
        if (--ptr->use == 0) delete ptr;
    
        ptr = rhs.ptr;
        val = rhs.val;
    
        return *this;
    }
        int obj = 1;
        ChasPtr ptr1(&obj, 42);
        ChasPtr ptr2(ptr1);
    
        cout << ptr1.get_ptr_val() << " , " << ptr1.get_int() << endl;
        cout << ptr2.get_ptr_val() << " , " << ptr2.get_int() << endl;
    
        ptr2.set_ptr_val(10);
        ptr2.set_int(50);
        cout << ptr1.get_ptr_val() << " , " << ptr1.get_int() << endl;
        cout << ptr2.get_ptr_val() << " , " << ptr2.get_int() << endl;
  • 相关阅读:
    Java中Date和Calender类的使用方法
    看《做性能测试需要做些什么》
    【笔记】jquery append,appendTo,prepend,prependTo 介绍
    【实践】jquery实现滑动动画及轮播
    【实践】四联联动 + 更加优化
    【实践】jQuery实现三联联动
    关于导入excel报错的处理(xls,xlsx)
    递归算法及经典案例
    验证身份证真假
    正则表达式
  • 原文地址:https://www.cnblogs.com/hongweijiang/p/14269200.html
Copyright © 2011-2022 走看看