1樓:匿名使用者
vc 析構函式的宣告: (舉例如下)
當規定類只能在堆上分配記憶體時,就可以將析構函式宣告為:
class alloc
;如果在堆上分配空間,因為只有在delete時才會呼叫析構函式,故可以新增乙個destroy()函式來釋放,從而解決不能在析構函式中新增delete的問題。
class alloc
private:
~alloc();
};析構函式(destructor) 與建構函式相反,當物件脫離其作用域時(例如物件所在的函式已呼叫完畢),系統自動執行析構函式。析構函式往往用來做「清理善後」
的工作(例如在建立物件時用new開闢了一片記憶體空間,應在退出前在析構函式中用delete釋放)。析構函式名也應與類名相同,只是在函式名前面加乙個位取反符~,例如~stud( ),以區別於建構函式。它不能帶任何引數,也沒有返回值(包括void型別)。
只能有乙個析構函式,不能過載。如果使用者沒有編寫析構函式,編譯系統會自動生成乙個預設的析構函式(即使自定義了析構函式,編譯器也總是會為我們合成乙個析構函式,並且如果自定義了析構函式,編譯器在執行時會先呼叫自定義的析構函式再呼叫合成的析構函式),它也不進行任何操作。所以許多簡單的類中沒有用顯示的析構函式。
2樓:匿名使用者
在定義建構函式的標頭檔案裡先定義析構函式;
比如有class celementdlg : public cdialog
析構函式怎麼用,在c++中的
3樓:
析構函式是乙個類的例項銷毀的時候,被自動呼叫的函式,一般用來做一些清理性的工作。
4樓:貓與豬的世界
就是呼叫完類的實體物件後,需要呼叫析構函式
5樓:影視動作秀
析構函式,就是善後處理,該物件的生命週期結束了,它負責善後的一些工作,如釋放已分配的記憶體等。你將該物件delete掉時,析構函式就自動執行了,不用你去呼叫它的。
簡單的舉個例子:
假如有class test
~test()
}那麼在mian 函式中,你new 了乙個 test 物件後,再將它delete 掉,這時析構函式~test();就自動執行了,釋放 a 的記憶體,並列印出"析構函式執行了"。
大家幫忙看一下 vc 析構函式無效?
6樓:匿名使用者
析構函式必須和類名相同。並且前面加「~」號。
建構函式也是一樣的,並且不要有任何返回型別。
7樓:匿名使用者
析構函式不能是虛構函式吧?
c++ 中將建構函式,析構函式宣告為private,protected
8樓:大滿at梅山
你提出這個問題,說明你已經對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++》裡面的乙個條款。具體哪個條款不記得了。你自己去找吧。
9樓:匿名使用者
class t;}
這樣就行了,
t* pt = t::getnewt();
因為getnewt是公共的可以呼叫,公共方法的內部可以使用該類的所有成員與函式,但是一定要是靜態的。
這樣的做法一般為了使用者不要私自建立物件,必須通過某些固定的方式來建立,因為可能要做一些額外的處理。
設計模式裡面就有單件這種說法就是說有乙個類它只建立一次,然後所有模組通用這個類例項。因為建立多個會對程式造成負荷過重,比如登錄檔這樣類。使用這種方式有個好處就是需要時才會建立新的物件,不呼叫時就會有新的物件產生,並且這個物件例項是惟一的
class single;};
single* single::gpsg = null;
void sfun();
10樓:
不會把所有的建構函式都宣告為私有的, 一般被宣告為私有的建構函式是拷貝建構函式, 同時也把operator =宣告成私有的, 這樣是為了禁止物件被自複製.
11樓:程式小兵
建構函式設定為私有,是單身模式
也就是說,它只允許乙個類有乙個例項,不允許設定多個例項
12樓:匿名使用者
不知道你是否知道程式的設計模式
其中就有一種叫「單例」 這種設計模式的特點就是在乙個程式中該類只有乙個例項物件
例如乙個類的建構函式是私有的 那麼你可以在該類定義乙個共有的靜態的函式
讓這個函式來new出來物件 並返回該物件的指標關於析構函式也是類似的 關鍵是這種設計模式 要求的是程式設計師自身的邏輯能力能夠駕馭
先將這麼多吧 如果還不行可以聯絡我
c 中析構函式可以實現什麼,c 中的虛擬析構函式有什麼作用?
析構函式名與類名相同,只是在函式名前面加乙個位取反符 例如 stud 以區別於建構函式。它不能帶任何引數,也沒有返回值 包括void型別 只能有乙個析構函式,不能過載。如果使用者沒有編寫析構函式,編譯系統會自動生成乙個預設的析構函式 即使自定義了析構函式,編譯器也總是會為我們合成乙個析構函式,並且如...
c 析構函式何時會被呼叫,C 析構函式何時會被呼叫?
析構函式 destructor 與建構函式相反,當物件脫離其作用域時 例如物件所在的函式已呼叫完畢 系統自動執行析構函式。析構函式往往用來做 清理善後 的工作 例如在建立物件時用new開闢了一片記憶體空間,應在退出前在析構函式中用delete釋放 c 中的每個類都會有乙個析構函式,當這個類的物件被銷...
C什麼時候需要用到析構函式,C 中析構函式具體是什麼時候被呼叫
有點偏頗.析構函式 是在你的類執行 結束後 再執行的方法。釋放資源只的他的乙個作用之一。必須說這類執行結束了,你操作其它的類或者其它的內容就用到它了。釋放資源只是它作用一種。如果是託管了,系統就會自己幫你釋放的。不過有的程式設計師控制能力比較強,託管的也自己來操作釋放。這樣可以系統資源最大話利用。析...