C/C++—— 預設建構函式是否會執行
在我瞭解預設建構函式之前,我一直以為兩點:
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的建構操作
相關文章
- C++ 建構函式和解構函式C++函式
- C++複製建構函式C++函式
- 深度解讀《深度探索C++物件模型》之預設建構函式C++物件模型函式
- C++入門記-建構函式和解構函式C++函式
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- C++行內函數、函式過載與函式預設引數C++函數函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- c++ 的學習 建構函式1C++函式
- C++型別轉換建構函式C++型別函式
- C++拷貝建構函式詳解C++函式
- 預設建構函式和帶預設值的建構函式不能同時存在函式
- 預設建構函式學習函式
- c++函式模板和執行機制C++函式
- C++——建構函式之初始化列表C++函式
- C++:建構函式的分類和呼叫C++函式
- C++_預設建構函式和過載以及設計模式C++函式設計模式
- c/c++ 拷貝控制 建構函式的問題C++函式
- C++解構函式C++函式
- c++中內建函式C++函式
- c++內建函式物件C++函式物件
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- 迴圈單連結串列建構函式、解構函式C++實現函式C++
- C++學習筆記-----類和建構函式C++筆記函式
- C++ 移動構造和複製建構函式匹配C++函式
- C++ 建構函式實戰指南:預設構造、帶引數構造、複製構造與移動構造C++函式
- c++ 執行緒函式傳遞資料 namespaceC++執行緒函式namespace
- C++ 類建構函式初始化列表介紹C++函式
- 執行建構函式中指定的任務函式
- 深入分析C++物件模型之移動建構函式C++物件模型函式
- 關於C++中建構函式的常見疑問C++函式
- C++拷貝建構函式(深拷貝,淺拷貝)C++函式
- 在定義C++, C通用介面函式時讓C++介面支援預設引數C++函式
- 教你如何檢查一個函式是否為JavaScript執行時環境內建函式函式JavaScript
- C++函式C++函式
- [cpp]C++中的解構函式C++函式
- c++中使用建構函式初始化列表的情況C++函式
- 建立派生類物件,建構函式的執行順序物件函式
- c++ 執行緒函式傳遞資料 物件和變數C++執行緒函式物件變數