私有建構函式(某位大神的講解)
阿新 • • 發佈:2019-01-24
#include <iostream> //建構函式私有 class A { private: static int dog; //#1# 靜態資料成員 A(){ std::cout << "A類建構函式\n"; } public: static A* fun(){ return new A; } //static指出這是靜態成員函式 //該靜態成員函式因為屬於類的成員函式所以可以訪問私有部分,建立一個 物件 返回其地址 }; A* S = A::fun(); //呼叫靜態成員函式方法是 類名::函式名() //注意: //1、靜態成員函式不與物件關聯,因此只能使用靜態資料成員,非靜態成員函式也可使用靜態資料成員 //2、靜態函式無this指標,因此物件無法呼叫(成員函式是用this指標訪問呼叫物件的資料的,隱式傳遞) //3、若靜態成員函式在外部定義,不能使用關鍵字 static 只在宣告時使用(或在類內宣告) //靜態資料成員(參加 “#1#”)即使私有,也可使用 如 A::dog訪問和初始化、賦值 //原因:靜態資料成員 並未和類 的其他非靜態資料成員放在一起,而是放在別處,和全域性變數一樣 //而且即使建立多個類物件,只有一個靜態資料成員,無副本 //通常類所有的物件共享一組成員函式,也就說建立物件時,只需分配儲存非靜態的資料成員空間 // 其他只有一個,無副本,(靜態資料成員,靜態成員函式,列舉常量) /*私有建構函式用途: 常用與限定類的物件數量,例如 ostream類【物件有 cout ceer。。。】不能自定義物件 你可以試試,編譯器會報錯,大概就是沒有公有的建構函式或者建構函式私有無法訪問 限定方法:用一個靜態資料成員限定 物件數量 靜態成員函式構建物件前,檢測這個變數是否為0,不為0才建立 下面有個例子*/ class B { static int dog; //預設訪問許可權 private B(){ std::cout << "構造B、\n"; } public: static B* fun(); }; int B::dog = 5; //初始化 限定只能有 5個B的物件 B* B::fun() { if (dog > 0) //檢測是否已到限定數量 return new B; std::cout << "超出數量限制\n"; return nullptr; //C++11空指標 }
感謝大神的講解