管理指針成員(智能指針)
阿新 • • 發佈:2017-08-02
friend get gson edi -h pan per 簡單記錄 clas
smart-ptr.h
value-ptr.h
main函數
Output:
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; }
常規指針類(淺拷貝):
原始數據:
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!
管理指針成員(智能指針)