將建構函式,析構函式宣告為私有和保護的,那麼物件如何建立?
已經不能從外部呼叫建構函式了,但是物件必須被構造,應該如何解決,麻煩大家幫忙說明,關於構造,析構函式宣告為私有和保護時的用法???
提出這個問題,說明你已經對c++有所思考了。從語法上來講,乙個函式被宣告為protected或者private,那麼這個函式就不能從「外部」直接被呼叫了。
對於protected的函式,子類的「內部」的其他函式可以呼叫之。
而對於private的函式,只能被本類「內部」的其他函式說呼叫。
語法上就是這麼規定的,你肯定也知道的咯。
那麼為什麼有時候將建構函式或者析構函式宣告為protected的或者private的?
通常使用的場景如下:
1。如果你不想讓外面的使用者直接構造乙個類(假設這個類的名字為a)的物件,而希望使用者只能構造這個類a的子類,那你就可以將類a的建構函式/析構函式宣告為protected,而將類a的子類的建構函式/析構函式宣告為public。例如:
class a
public: ....
};calss b : public a
....
};a a; // error
b b; // ok
2. 如果將建構函式/析構函式宣告為private,那只能這個類的「內部」的函式才能構造這個類的物件了。這裡所說的「內部」不知道你是否能明白,下面舉個例子吧。
class a
~a()
public:
void instance()//類a的內部的乙個函式
};上面的**是能通過編譯的。上面**裡的instance函式就是類a的內部的乙個函式。instance函式體裡就構建了乙個a的物件。
但是,這個instance函式還是不能夠被外面呼叫的。為什麼呢?
如果要呼叫instance函式,必須有乙個物件被構造出來。但是建構函式被宣告為private的了。外部不能直接構造乙個物件出來。
a aobj; // 編譯通不過
aobj.instance();
但是,如果instance是乙個static靜態函式的話,就可以不需要通過乙個物件,而可以直接被呼叫。如下:class a
~a()
public:
static a& instance()
void print()
private:
int data;
};a& ra = a::instance();
ra.print();
上面的**其實是設計模式singleton模式的乙個簡單的c++**實現。
還有乙個情況是:通常將拷貝建構函式和operator=(賦值操作符過載)宣告成private,但是沒有實現體。
這個的目的是禁止乙個類的外部使用者對這個類的物件進行複製動作。
細節請看《effective c++》裡面的乙個條款。具體哪個條款不記得了。
建構函式定義為private,protected
將建構函式,析構函式宣告為私有和保護的,那麼物件如何建立?已經不能從外部呼叫建構函式了,但是物件必須被構造,應該如何解決,麻煩大家幫忙說明,關於構造,析構函式宣告為私有和保護時的用法?提出這個問題,說明你已經對c 有所思考了。從語法上來講,乙個函式被宣告為protected或者private,那麼這...
建構函式定義為private,protected
將建構函式,析構函式宣告為私有和保護的,那麼物件如何建立?已經不能從外部呼叫建構函式了,但是物件必須被構造,應該如何解決,麻煩大家幫忙說明,關於構造,析構函式宣告為私有和保護時的用法?提出這個問題,說明你已經對c 有所思考了。從語法上來講,乙個函式被宣告為protected或者private,那麼這...
定義拷貝建構函式必須同時定義建構函式
今天測試static cast 時發現乙個類如果只有拷貝建構函式是不能通過編譯的,下面給個例子 class a public a const a ref cout error c2512 a 沒有合適的預設建構函式可用 解決方法 給a新增合適的建構函式。下面給出新增了建構函式的 並測試了static...