什麼是單例模式?函數
類對象有且只有一個,任何使用該類的人在不改變源碼的前提下都不能生成第二個對象。spa
實現單例的要點是什麼?3d
阻止定義對象即阻止普通構造函數和拷貝構造函數。以class Type爲例對象
Type(const Type&)爲拷構,定義:第一個參數爲自身類類型的引用,且其它參數都有默認值的構造函數。blog
其它即爲普構,且以Type()無參的默認構造函數爲首表。編譯器
默構爲private,且再無其它普構,即阻止一切形如 Type t; 和 Type t(...); 方式生成其它對象。源碼
拷構爲private且無定義,private可阻止普通用戶代碼以 Type t = Type::GetInstance(); 方式建立其它對象。此時,成員函數和友元函數仍舊能夠拷貝對象。聲明但不定義一個成員函數是合法的,試圖訪問一個未定義的成員將致使一個連接時錯誤。如此,成員函數和友元函數將沒法建立對象。編譯
與合成默構不一樣,即便咱們定義了其它構造函數,編譯器也會爲咱們合成一個拷構,故拷構需顯示聲明。class
知識擴展?變量
凡類對象,定義必初始化,方式無外直接初始化和拷貝初始化。
拷貝初始化在下列狀況下發生
1.以=定義變量,如Type t2 = t1;
2.參數傳遞:對象做爲實參傳遞給一個非引用類型的形參;
3.函數返回值:從一個返回類型爲非引用類型的函數返回一個對象
拷貝初始化一般依靠拷貝構造函數完成。
其它爲直接初始化,直接初始化調用普通構造函數完成。
故抑制普構和拷構便可抑制初始化,達到禁止對象建立。
標準形式是什麼?
頭文件
實現文件