C/C++—— 預設建構函式是否會執行

readyao發表於2016-04-06

在我瞭解預設建構函式之前,我一直以為兩點:

1.如果類中我不宣告建構函式,編譯器會自動生成預設建構函式並執行。
2.編譯器自動生成預設建構函式會將類成員初始化。

然而這兩點都是錯的。

首先,看一個例子程式,沒有建構函式,有成員變數。

原始碼:

/*****************************************************************
    > File Name: test.cpp
    > Author: 
    > Mail: 
    > Created Time: 2016年04月06日 星期三 22時06分45秒
 *****************************************************************/

#include <iostream>
using namespace std;

class Tree
{
    public:

        //Tree(){num = 0; p = NULL;}
        void get_num(){
            cout << "num = " << num << endl;
        }

        void get_p(){
            if(p == NULL)
                cout << "p == NULL" << endl;
            else
                cout << "p != NULL" << endl;
        }

    private:
        int num;
        char * p;
};

int main()
{
    int n;
    cout << "Test default constructor: " << endl;

    Tree tree;
    cout << "sizeof(tree) = " << sizeof(tree) << endl;
    tree.get_num();
    tree.get_p();

    return 0;
}

執行結果輸出如下:

Test default constructor: 
sizeof(tree) = 16
num = 539337088
p == NULL

從執行結果可以看出沒有對成員變數初始化。

下面接著看該程式的gdb除錯過程:

這裡寫圖片描述

在上圖的除錯資訊中可以看到沒有執行預設建構函式。

再次看上面的例子程式,新增了下面的建構函式。

Tree(){num = 0; p = NULL;}

執行結果輸出為:

Test default constructor: 
sizeof(tree) = 16
num = 0
p == NULL

下面接著看該程式的gdb除錯過程:

這裡寫圖片描述

在上圖的除錯資訊中可以看到執行了建構函式。

結論:

1.如果類中不宣告建構函式,編譯器會自動生成預設建構函式並執行。
2.編譯器自動生成預設建構函式會將類成員初始化。

然而這兩點都是錯的。

只有下面四種情況下才會執行預設建構函式:
1.”帶有Default Constructor”的Member Class Object
2.”帶有Default Constructor”的Base Class
3.”帶有一個Virual Function”的Class
4.”帶有一個virual Base class”的Class

詳細介紹看:深度探索C++物件模型 2.1Default Constructor的建構操作

相關文章