1. 程式人生 > >管理指針成員(智能指針)

管理指針成員(智能指針)

friend get gson edi -h pan per 簡單記錄 clas

C++ Primer 學習中。。。

簡單記錄下我的學習過程 (代碼為主)


【題外話】過幾天就要出去找工作了。這幾天在家看看曾經做過的題。

。。如今想想時間過得真的好快,希望自己能找一份自己愜意的工作。

。。!!

技術分享 <夢想還是要有的,萬一實現了呢!

>


以下是學習心得:

技術分享


這幅圖非常好的闡述了僅僅能指針的概念,事實上智能指針就是一個計數類!以後多用用就熟悉了。


技術分享



plain-ptr.h


#ifndef PLAIN-PTR_H_INCLUDED
#define PLAIN-PTR_H_INCLUDED

class AHasPtr{
public:
    AHasPtr(int *p,int i):ptr(p),val(i){}
    //設計接口
    int *get_ptr() const {return ptr;}
    int get_int() const {return val;}

    void set_ptr(int *p) {ptr=p;}
    void set_int(int i) {val=i;}

    int get_ptr_val()const {return *ptr;}
    void set_ptr_val(int val)const{*ptr=val;}
private:
    int val;
    int *ptr;   //有指針成員,一般都是淺復制
};

#endif // PLAIN-PTR_H_INCLUDED


smart-ptr.h

#ifndef SMART-PTR_H_INCLUDED
#define SMART-PTR_H_INCLUDED

class U_Ptr
{
    friend class BHasPtr;
private:
    int *ip;
    size_t use; //計數
    U_Ptr(int *p):ip(p),use(1){}
    ~U_Ptr(){delete ip;}
};

class BHasPtr{
public:
    BHasPtr(int *p,int i):ptr(new U_Ptr(p)),val(i){}
    BHasPtr(const BHasPtr &orig):ptr(orig.ptr),val(orig.val)//復制構造函數
    {
        ++ptr->use;
    }
    BHasPtr& operator=(const BHasPtr&);

    ~BHasPtr()
    {
        if(--ptr->use == 0) delete ptr;
    }
    //設計接口
    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;}
private:
    int val;
//    int *ptr;
    U_Ptr *ptr; //這裏使用智能指針類
};

BHasPtr& BHasPtr::operator=(const BHasPtr &rhs)
{
    ++rhs.ptr->use;
    if(--ptr->use == 0)delete ptr;

    ptr = rhs.ptr;
    val = rhs.val;
    return *this;
}
#endif // SMART-PTR_H_INCLUDED


value-ptr.h

#ifndef VALUE-PTR_H_INCLUDED
#define VALUE-PTR_H_INCLUDED

class CHasPtr{
public:
    CHasPtr(const int &p,int i):ptr(new int(p)),val(i){}
    CHasPtr(const CHasPtr &orig)
        :ptr(new int(*orig.ptr)),val(orig.val){}
    CHasPtr& operator=(const CHasPtr&);

    ~CHasPtr(){delete ptr;}//三原則:一起寫復制函數、=操作符函數和析構函數
    //設計接口
    int *get_ptr() const {return ptr;}
    int get_int() const {return val;}

    void set_ptr(int *p) {ptr=p;}
    void set_int(int i) {val=i;}

    int get_ptr_val()const {return *ptr;}
    void set_ptr_val(int val)const{*ptr=val;}
private:
    int val;
    int *ptr;   //有指針成員。一般都是淺復制
};
CHasPtr& CHasPtr::operator = (const CHasPtr &rhs)
{
    *ptr=*rhs.ptr;
    val=rhs.val;
    return *this;
}

#endif // VALUE-PTR_H_INCLUDED


main函數

#include <iostream>
#include "plain-ptr.h"
#include "smart-ptr.h"
#include "value-ptr.h"

using namespace std;
void test_AHasPtr()//淺拷貝&&懸垂指針
{
    int i=42;
    AHasPtr p1(&i,50);
    AHasPtr p2=p1;//淺拷貝
    cout<<"常規指針類(淺拷貝):"<<endl<<"原始數據:"<<endl;
//    cout<<p2.get_ptr_val()<<endl;
    cout<< p1.get_ptr_val()<<","<<p1.get_int()<<endl;
    cout<< p2.get_ptr_val()<<","<<p2.get_int()<<endl;

    p1.set_ptr_val(0);//改動p1
    cout<<"改動以後:"<<endl;
//    cout<<p2.get_ptr_val()<<endl;
    cout<< p1.get_ptr_val()<<","<<p1.get_int()<<endl;
    cout<< p2.get_ptr_val()<<","<<p2.get_int()<<endl;

    /**---以下來看野指針的情況---**/
    int *id = new int(66);
    AHasPtr ptr(id,10);
    cout<<ptr.get_ptr_val()<<endl;//66
    //刪除id指針
    delete id;
  //  cout<<ptr.get_ptr_val()<<endl;//輸出亂碼
    //由於指向的id指針已經被刪除了,就成了野指針or懸垂指針
    cout<<endl;
}

void test_CHasPtr()
{
    int obj = 0;
    CHasPtr p1(obj,12);
    CHasPtr p2(p1);
    cout<<"值型類(深拷貝):"<<endl<<"原始數據:"<<endl;
    cout<< p1.get_ptr_val()<<","<<p1.get_int()<<endl;
    cout<< p2.get_ptr_val()<<","<<p2.get_int()<<endl;

    p2.set_ptr_val(6);
    p2.set_int(24);
    cout<<"改動以後:"<<endl;
    cout<< p1.get_ptr_val()<<","<<p1.get_int()<<endl;
    cout<< p2.get_ptr_val()<<","<<p2.get_int()<<endl;
    cout<<endl;
}

void test_BHasPtr()
{
    int obj = 75;
    BHasPtr p1(&obj,88);
    BHasPtr p2(p1);
    cout<<"智能指針類(計數類):"<<endl<<"原始數據:"<<endl;
    cout<< p1.get_ptr_val()<<","<<p1.get_int()<<endl;
    cout<< p2.get_ptr_val()<<","<<p2.get_int()<<endl;

    p2.set_ptr_val(15);
    p2.set_int(22);
    cout<<"改動以後:"<<endl;
    cout<< p1.get_ptr_val()<<","<<p1.get_int()<<endl;
    cout<< p2.get_ptr_val()<<","<<p2.get_int()<<endl;
    cout<<endl;
}
int main()
{
    test_AHasPtr();
    test_CHasPtr();
    test_BHasPtr();
    cout << "Hello world!" << endl;
    return 0;
}



Output:


常規指針類(淺拷貝):
原始數據:
42,50
42,50
改動以後:
0,50
0,50
66

值型類(深拷貝):
原始數據:
0,12
0,12
改動以後:
0,12
6,24

智能指針類(計數類):
原始數據:
75,88
75,88
改動以後:
15,88
15,22

Hello world!



管理指針成員(智能指針)