1. 程式人生 > >類的建構函式和解構函式的呼叫順序(一)

類的建構函式和解構函式的呼叫順序(一)

知識點一 關於類的建構函式和解構函式:

1、建構函式不必須與類名相同,不具有型別,不返回任何值。
2、建構函式可以過載、便於使用者輸入不同型別的引數。
3、預設建構函式為不含任何引數的建構函式,或稱為“預設建構函式”。
4、先構造的後析構,後構造的先析構。
5、在全域性範圍內定義的物件(所有函式以外定義的物件),它的建構函式在檔案中的所有函式(包括main函式)執行之前呼叫。如果有多個檔案中都定義了全域性物件,這些物件的建構函式的呼叫順序是不確定的。當main函式執行完畢後或者呼叫exit函式時(此時函式終止),呼叫解構函式。
6、物件賦值是指同類物件所有資料成員的賦值,不對成員函式賦值(函式只是程式碼段,不需要也五福賦值)。
7、類的資料成員中不能包括動態分配的資料。
先貼一段程式碼:

#include "stdafx.h"
#include <iostream>
using namespace std;
class Class1
{
public:
    Class1() :_index(0)
    {
        cout << "Create" << endl;
    }
    Class1(int index) :_index(index)
    {
        cout << "Create" << _index << endl;
    }
    ~Class1()
    {
        cout
<< "Destroy" << _index << endl; } Class1& operator=(const Class1& other) { cout << "operator= from " << other._index << " to " << _index << endl; return *this; } Class1& operator=(Class1&& other) { cout
<< "operator=2 from " << other._index << " to " << _index << endl; return *this; } private: int _index; }; int _tmain(int argc, _TCHAR* argv[]) { { Class1 obj; //1 } { Class1 obj1(1); //2 Class1 obj2(2); //3 Class1 *obj3 = new Class1(3); //4 obj2 = obj1; //5 obj2 = *obj3; //6 } return 0; }

執行結果:

Create
Destroy0        //1
Create1         //2
Create2         //3
Create3         //4
operator= from 1 to 2  //5
operator= from 3 to 2
Destroy2
Destroy1           //6

解析1:關於類的構造和析構

{
  Class1 obj;   //1
}

表示該類被構造,在該程式碼段執行結束,該類被析構;第二段中,先將上述所有的類構造後,在程式碼段結束時,呼叫解構函式,順序為先構造的後析構。
C++:類的建構函式和解構函式

知識點二、拷貝建構函式:
1、拷貝建構函式時一種特殊的建構函式,實現物件的複製。如果使用者自己未定義複製建構函式,編譯器自己提供一個預設的複製建構函式,其作用是簡單的複製類中的每個資料成員,被稱為“淺拷貝”,就是對於有指標資料的成員所指向的記憶體單元的資料是不能被預設拷貝過去的。
2、其形式為:類名 物件一 物件二,如:BOX::BOX(const BOX &b))
3、當建構函式涉及到動態儲存分配空間時,要自己寫拷貝建構函式,並且要深拷貝。主要是拷貝指標指向的記憶體單元的內容。
解析2:拷貝建構函式:

obj2 = obj1;      //5