C 特殊類的設計

2021-10-23 05:51:31 字數 2208 閱讀 2333

乙個類它可以在棧,堆,資料段上呼叫

舉例:

#define _crt_secure_no_warnings

他們都能呼叫這個類建立物件。

怎麼將其設定成特殊類呢?

實現步驟:

1… 提供乙個靜態的成員函式,在該靜態成員函式中完成堆物件的建立,首先將建構函式私有化,只有類裡面的元素才能訪問

class heaponly

private:

heaponly()

};intmain()

棧和資料段則無法訪問類的建構函式,而堆可以

但是還有問題,定義物件,可以通過棧和資料段的拷貝構造來訪問類

int

main()

2.所以我們要封掉類中預設生成的拷貝建構函式,方法就是讓其私有化(c++98和c++11兩種方法)

總結:

1. 將類的建構函式私有,拷貝構造宣告成私有。防止別人呼叫拷貝在棧上生成物件。

2. 提供乙個靜態的成員函式,在該靜態成員函式中完成堆物件的建立

**實現

// 只能在堆上

class heaponly

private:

heaponly()

//拷貝構造私有化

//c++98:只宣告,不定義

//heaponly(const heaponly&);

//c++11

heaponly

(const heaponly&

)= delete;

//刪掉拷貝構造};

intmain()

首先要在棧上存放的是區域性變數,函式引數和返回值,要在棧上建立類函式則必須要使用到拷貝建構函式,所以我們不能將拷貝建構函式私有化所以我們只能做到不能在堆上建立,但是資料段建立無法處理。方法一:和上邊思想一樣,私有化建構函式

class stackonly

private:

stackonly()

};

方法二:遮蔽new

因為new在底層呼叫void* operator new(size_t size)函式,只需將該函式遮蔽掉即可。

注意:也要防止定位new

class stackonly

private:

void

* operator new

(size_t size)

;void operator delete

(void

* p);}

;int

main()

方法一:c++98:

1.派生類建構函式必須呼叫基類建構函式

2.基類私有成員在派生類中不可見

私有化基類的建構函式

class noninherit

private:

noninherit()

};class inherit : public noninherit // 借助子類建構函式來設定

;

注意初始化派生類時,編譯器不會報錯,而是執行時呼叫建構函式報錯。

方法二:

c++11方法

final關鍵字,final修飾類,表示該類不能被繼承。

最終類不能被繼承

class a final

;

c 設計特殊的類

設計乙個特殊的類,該類只能在堆上建立物件 將類的析構函式宣告為private,但是為了建立該類的物件,則必須提供建立物件和釋放物件的介面,用static函式成員實現 class heaponly static void deleteinstance heaponly obj private heap...

C 類的特殊成員

靜態成員 static static int m int ca m 0 類中的靜態資料初始化,靜態成員不屬於物件,無法通過物件的操作進行初始化,它是屬於類的,初始化的時候不管公有私有都在類外進行 類中的靜態資料成員,可以被普通函式訪問 常量成員 類中的常量成員分為兩種 常量資料成員,常量函式成員 c...

C 特殊類設計1 單例模式

乙個類只能建立乙個物件,即單例模式,該模式可以保證系統中該類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。單例模式有兩種實現模式 飽漢,餓漢 餓漢模式就是說不管你將來用不用,程式啟動時就建立乙個唯一的例項物件。思路 簡單來說,就是將類的建構函式,拷貝建構函式,賦值運算子過載...