關於C++的類的幾點注意點

  1. 析構函數絕對不會有返回值,也沒有任何參數,絕對不可能重載
  2. 析構函數用於釋放在構造函數或對象生命週期內分配的資源,在對象結束生命後會自動調用析構函數來善後。感覺一般都是我們在構造對象的時候,在對象內部要手動申請一塊內存,然後我們在析構函數中需要將其釋放掉
  3. 即使是自己定義的類,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)
{
    this->age=inputobjest.age;
    this->ptr =new int[20];
    for(int i=0;i<20;i++)
    {
        this->ptr[i]=inputobjest[i];
    }
}
發佈了46 篇原創文章 · 獲贊 10 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章