乙個類它可以在棧,堆,資料段上呼叫
舉例:
#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 單例模式
乙個類只能建立乙個物件,即單例模式,該模式可以保證系統中該類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。單例模式有兩種實現模式 飽漢,餓漢 餓漢模式就是說不管你將來用不用,程式啟動時就建立乙個唯一的例項物件。思路 簡單來說,就是將類的建構函式,拷貝建構函式,賦值運算子過載...