您好,登錄后才能下訂單哦!
1、構造函數
在我們定義一個類后,對其實例化,值都是隨機的,然后我們自己在寫函數對其賦值,感覺是多余的,
C++就提供了在實例化時就初始化的過程,就叫做構造函數;
構造函數是特殊的公有成員函數,有一下特點:
(1)、構造函數與類名相同;
(2)、構造函數不寫返回值;
(3)、在實例化對象時,自動 必須 一次調用;
(4)、可以重載(人生而不平等,這樣理解);
(5)、構造函數可以在類內定義,也可以在類外定義(通過作用域限定符::)
(6)、C++會自動的給出默認的構造函數,要是自己寫了,就不會再提供默認的構造函數了;
class Test{ public: Test(int d = 0) : data(d){}
這就是一個缺省的構造函數,存在時,不能再有無參的構造函數(不然是初始化為隨機值還是默認值0);
2、構造函數的3個作用:
(1)、構造對象,自動調用構造函數;
(2)、初始化對象;
(3)、類型轉換
分析:t1是Test類型的,100是×××的;不同類型怎么能賦值呢?
:C C++都是強類型語言,如果類型不一樣,從某種角度上說不許賦值;
int a; double d = 12.34; a = d;
類型不一樣,不可能直接賦值,的借助中間臨時變量來賦值;
現在來看t = 100;
100 必須的找到中間橋梁Test類型的,才能給Test類型的t賦值,里面是對應成員一一賦值;
剛好有個構造函數,并且有一個參數,通過構造函數,把×××100轉化為Test類型,此時實例化了一個對象,剛好轉換為類型一致,可以賦值。
此時還存在一個這樣的問題:關鍵字explicit 顯示的,作用:
a、預防構造函數被隱式調用;
b、只能在構造函數前使用此關鍵字;
此時隱式賦值,不能調用顯示構造函數,所以出錯;
Test t = (Test)100;強制類型轉換就是顯示調用,explicit修飾的構造函數方可被調用!
現在看下面的問題:Test類型能否給int類型賦值?
兩邊類型不一致,并且在類的內部沒有找到轉換相同類型Test->int類型的函數(也就是說沒有找到中間橋梁);所以出錯!
必須的用到運算符重載(添加方法),下面這個叫做類型轉換,————>不能有返回值;
添加在類內一個方法:
public: operator int(){ return data; }
將Test類型轉換為int,(有了這個方法就可以實現),從而找到橋梁,類型一致便可賦值;
原理: 借助了中間的無名變量空間(充當橋梁);
結果如下:
3、析構函數
~Test(){}
析構函數就是釋放對象占用的空間,對任何函數死亡都是一樣的,所以任何對象的析構只能用相同的方式進行,
析構函數無重載,無參,無返回,只有一個;(死是平等的)。
特點:
(1)、析構函數與類名相同,但在前面加上'~',如:~Test(){}
(2)、對象釋放時,系統自動調用析構函數(可以是默認的)。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。