1. 程式人生 > >私有建構函式(某位大神的講解)

私有建構函式(某位大神的講解)

#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空指標
}

感謝大神的講解