天天看點

vs 不能自動 析構函數_C++從零入門學習系列(3)構造函數與析構函數

對于 C++ 的學習,先把基礎概念弄明白,了解熟悉常見文法。

1、 構造函數 在我們定義一個類後,對其執行個體化,值都是随機的,然後我們自己在寫函數對其指派,感覺是多餘的, C++就提供了在執行個體化時就初始化的過程,就叫做構造函數。 構造函數是特殊的公有成員函數,有一下特點: (1)、構造函數與類名相同; (2)、構造函數不寫傳回值; (3)、在執行個體化對象時,自動 必須 一次調用; (4)、可以重載(人生而不平等,這樣了解); (5)、構造函數可以在類内定義,也可以在類外定義(通過作用域限定符::) (6)、C++會自動的給出預設的構造函數,要是自己寫了,就不會再提供預設的構造函數了;

class Test{
public:
Test(int d = 0) : data(d){}
           

這就是一個預設的構造函數,存在時,不能再有無參的構造函數(不然是初始化為随機值還是預設值0)。 2、 構造函數的3個作用 (1)、構造對象,自動調用構造函數; (2)、初始化對象; (3)、類型轉換。

vs 不能自動 析構函數_C++從零入門學習系列(3)構造函數與析構函數

分析:t1是Test類型的,100是×××的; 不同類型怎麼能指派呢? C C++都是強類型語言,如果類型不一樣,從某種角度上說不許指派;

類型不一樣,不可能直接指派,的借助中間臨時變量來指派; 現在來看 t = 100; 100 必須的找到中間橋梁Test類型的,才能給Test類型的t指派,裡面是對應成員一一指派;剛好有個構造函數,并且有一個參數,通過構造函數,把×××100轉化為Test類型,此時執行個體化了一個對象,剛好轉換為類型一緻,可以指派。 此時還存在一個這樣的問題: 關鍵字explicit  顯示的,作用: a、預防構造函數被隐式調用; b、隻能在構造函數前使用此關鍵字;

vs 不能自動 析構函數_C++從零入門學習系列(3)構造函數與析構函數

此時隐式指派,不能調用顯示構造函數,是以出錯;

vs 不能自動 析構函數_C++從零入門學習系列(3)構造函數與析構函數

Test t = (Test)100;強制類型轉換就是顯示調用,explicit修飾的構造函數方可被調用! 現在看下面的問題: Test類型能否給int類型指派?

vs 不能自動 析構函數_C++從零入門學習系列(3)構造函數與析構函數

兩邊類型不一緻,并且在類的内部沒有找到轉換相同類型Test->int類型的函數(也就是說沒有找到中間橋梁); 是以出錯! 必須的用到運算符重載(添加方法),下面這個叫做類型轉換,————>不能有傳回值; 添加在類内一個方法:

将Test類型轉換為int,(有了這個方法就可以實作),進而找到橋梁,類型一緻便可指派; 原理: 借助了中間的無名變量空間(充當橋梁)。 結果如下:

vs 不能自動 析構函數_C++從零入門學習系列(3)構造函數與析構函數

3、 析構函數

~Test(){}
           

析構函數就是釋放對象占用的空間,對任何函數死亡都是一樣的,是以任何對象的析構隻能用相同的方式進行。 析構函數無重載,無參,無傳回,隻有一個(死是平等的)。 特點: (1)、析構函數與類名相同,但在前面加上'~',如: ~Test(){} (2)、對象釋放時,系統自動調用析構函數(可以是預設的)。 推薦閱讀: 我為什麼建議大家一定的會 C 語言 從C語言如何過渡到C++,思維的轉變是關鍵! C++從零入門學習系列(1)---類與對象 一起學習技術

vs 不能自動 析構函數_C++從零入門學習系列(3)構造函數與析構函數