1. 程式人生 > 實用技巧 >引用及智慧指標 常成員及靜態成員介紹

引用及智慧指標 常成員及靜態成員介紹

引用

計數是計算機程式語言中的一種記憶體管理技術,是指將資源(可以是物件記憶體磁碟空間等等)的被引用次數儲存起來,當被引用次數變為零時就將其釋放的過程。使用引用計數技術可以實現自動資源管理的目的。

同時引用計數還可以指使用引用計數技術回收未使用資源的垃圾回收演算法。

每一個物件都有一個關聯的引用計數 —— 對該物件的活躍引用的數量。如果物件的引用計數是零,那麼它就是垃圾(使用者程式不可到達它),並可以回收。

每次修改指標引用時(比如通過賦值語句),或者當引用超出範圍時,編譯器必須生成程式碼以更新引用的物件的引用計數。如果物件的引用計數變為零,那麼執行時就可以立即收回這個塊(並且減少被回收的塊所引用的所有塊的引用計數),或者將它放到遲延收集佇列中。

#include <iostream>

#include <string>

using namespace std;

class Referenced

{

public:

//初始化這個類,引用計數設為1,並且將p指向傳入的地址

Referenced(int * pi)

{

refCount=1;

p=pi;

}

 

//引用計數加1

int ref()

{

return ++refCount;

}

 

//引用計數減1

int unref()

{

return --refCount;

}

 

//返回引用計數

int count()

{

return refCount;

}

 

//解構函式,釋放掉記憶體

~Referenced()

{

cout<<"delete referenced"<<endl;

delete p;

}

private:

int refCount;//引用計數,表示有多少個變數引用這塊記憶體

int * p;//真實的指標

};

 

//對指標進行管理的類,持有一個Referenced類的指標ptr,根據ptr中的

//引用計數來判斷是否呼叫delete來刪除掉這個指標ptr

class  Ref_ptr

{

public:

 

//使用int*指標初始化ptr,注意必須要放在初始化列表中

Ref_ptr(int * i):ptr(new Referenced(i))

{

}

 

//拷貝建構函式,又有一個變數指向了這塊記憶體

Ref_ptr(const Ref_ptr & rhs)

{

ptr=rhs.ptr;//將右運算元的引用計數物件賦值給左運算元

ptr->ref();//將它們的應用計數加1

}

 

//賦值操作符,右運算元的引用計數要減1,左運算元的引用計數要加1

Ref_ptr & operator=(const Ref_ptr & rhs)

{

if(&rhs==this)

return *this;

if(ptr->unref()==0)//賦值操作符,首先將當前類的引用計數減1

{

cout<<"delete Ref_ptr"<<endl;

delete ptr;

}

ptr=rhs.ptr;//將右運算元的引用計數賦值給當前物件

ptr->ref();//引用計數加1

return *this;

}

 

//解構函式,引用計數要減1,如果減為0,刪除這塊記憶體

~Ref_ptr()

{

if(ptr->unref()==0)

{

cout<<"delete Ref_ptr"<<endl;

delete ptr;

}

}

private:

Referenced * ptr;

};

 

int main()

{

//Referenced rd=new int(4);

Ref_ptr r=new int(4);

Ref_ptr r1=new int(5);

r=r1;

 

getchar();

return 0;

}

  

常成員函式:

通常函式體用const修飾

代表該函式不會修改物件資料的值

常成員函式傳入的this指標型別並非一般的type *const 而是const type *const

並且不能呼叫一般成員函式 可以呼叫常成員函式

Mutable修飾成員永遠不是const

初始化列表

通常使用在建構函式

寫法:

建構函式():

資料成員名1(初始化值),

資料成員名2(初始化值),

.....

{

}

寫法2:

C11不支援

Class 類名

{

Int a = 0;

Char b = 0;

}

靜態成員:

靜態資料成員所有物件公用該資料成員 一個物件內修改後 其他物件內的也修改

靜態成員函式

可以定義在類內部,也可以定義在外邊

Static type 作用域()::函式名()

{

}

靜態成員函式不能訪問一般成員 因為其並不傳入this指標 如若訪問 則需手動傳入引數

呼叫方式:函式名呼叫

類名::函式名();