析構函式絕對不會有返回值,也沒有任何引數,絕對不可能過載
析構函式用於釋放在建構函式或物件生命週期內分配的資源,在物件結束生命後會自動呼叫析構函式來善後。感覺一般都是我們在構造物件的時候,在物件內部要手動申請一塊記憶體,然後我們在析構函式中需要將其釋放掉
即使是自己定義的類,c++也提供預設的成員逐一初始化。比如下面的**
myclass zhangsan;
myclass lisi= zhangsan;
myclass wangwu;
wangwu=lisi;
以上**都可以在vs2015上編譯通過。其具體在內部執行的動作是:
- 讓lisi wangwu都具有myclass對應的成員變數和成員函式。
- 將zhangsan中成員變數的值賦給lisi wangwu
- 注意:對於類中自己申請的記憶體,eg:
int *ptr =new
int[20];
在預設類之間初始化的時候,lisi只會新建乙個指標ptr,分配指標所佔的記憶體空間,同時將指標的值取值為 zhangsan的ptr的值,也就是會指向zhangsan分配的記憶體空間上去(new int[20])。當zhangsan這個物件的生命週期結束之後,呼叫析構函式導致ptr指向的我們自己分配的記憶體被釋放掉的時候,lisi的ptr指向的記憶體就沒有意義了。
我覺得這種情況最容易出現在函式結束的時候返回值為類的時候。因為就是在函式呼叫結束的時候會發生部分物件生命週期結束(區域性變數),而部分任然保留。
而在物件生命週期上,我們可以總結以下幾點
1) 如果在乙個函式中定義了乙個物件(auto 區域性變數),當這個函式執行結束時,物件就會被銷毀,在物件被銷毀前自動執行析構函式。
2) static 區域性物件在函式呼叫結束時並不銷毀,因此也不呼叫析構函式,只有在程式結束時(如 main 函式結束或呼叫 exit 函式)才呼叫 static 區域性物件的析構函式。
3) 如果定義了乙個全域性物件(類似於在main函式中定義了乙個變數),也只有在程式結束時才會呼叫該全域性物件的析構函式。
4) 如果用 new 運算子動態地建立了乙個物件,當用 delete 運算子釋放該物件時,先呼叫該物件的析構函式。
因此為了解決上訴問題,我們不妨自己去寫類之間的互相賦值和互相初始化函式,c++為我們提供了這樣的功能。
對於用類的乙個物件初始化另外乙個物件,我們可以自己寫如下函式
myclass::myclass(const myclass &inputobjest)
}
c 類的幾點注意事項
1 可變資料成員 由mutable修飾 在const函式中可以修改 class screen screen display const 2 this指標 screen screen set char c 不能從const成員函式返回指向類物件的普通引用。const成員函式只能返回 this作為乙個c...
關於C 的建構函式的幾點注意
與任何其他函式一樣,建構函式具有名字 形參表和函式體。與其他函式不同的是,建構函式也可以包含乙個建構函式初始化列表。a sales item sales item const string book isbn book units sold 0 revenue 0.0 b sales item sa...
關於支付的幾點注意
無意中看到beecloud創始人講到做支付的經驗,感覺特別貼切,尤其在本人對接過幾家支付或託管業務相關的公司時,感觸更深,好一點的提供完整的 產線環境,對接很順暢,eg 匯付天下,有的雖然無仿產線環境,但是可以臨時搭建環境使用真錢做測試,同時運營支援到位,可以直接對接解決問題,eg 聯動優勢 連連支...