1. 程式人生 > >C++筆記 第十七課 物件的構造(上)---狄泰學院

C++筆記 第十七課 物件的構造(上)---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux

第十七課 物件的構造(上)

問題:物件中成員變數的初始值是多少?不定的

小實驗
下面的類定義中成員變數i和j的初始值為什麼?
在這裡插入圖片描述

17-1 成員變數的初始值

#include <stdio.h>
class Test
{
private:
    int i;
    int j;
public:
    int getI() { return i; }
    int getJ() { return j; }
};
Test gt;
int main()
{
    printf("gt.i = %d\n", gt.getI());
    printf("gt.j = %d\n", gt.getJ());
    
    Test t1;
    
    printf("t1.i = %d\n", t1.getI());
    printf("t1.j = %d\n", t1.getJ());
    
    Test* pt = new Test;
    
    printf("pt->i = %d\n", pt->getI());
    printf("pt->j = %d\n", pt->getJ());
    
    delete pt;
    
    return 0;
}
執行結果
gt.i = 0
gt.j = 0
t1.i = 4196368
t1.j = 0
pt->i = 0
pt->j = 0

1.物件的初始化

從程式設計的角度,物件只是變數,因此:
上建立物件時,成員變數初始為隨機值
上建立物件時,成員變數初始為隨機值
靜態儲存區建立物件時,成員變數初始為0值
生活中的物件都是在初始化後上市的
初始狀態(出廠設定)是物件普遍存在的一個狀態
問題:程式中如何對一個物件進行初始化?
一般而言,物件都需要一個確定的初始狀態
解決方案
在類中提供一個public的initialize函式
物件建立後立即呼叫initialize函式進行初始化
在這裡插入圖片描述

17-2 初始化函式

#include <stdio.h>
class Test
{
private:
    int i;
    int j;
public:
    int getI() { return i; }
    int getJ() { return j; }
    void initialize()
    {
        i = 1;
        j = 2;
    }
};
Test gt;
int main()
{
    gt.initialize();
    
    printf("gt.i = %d\n", gt.getI());
    printf("gt.j = %d\n", gt.getJ());
    
    Test t1;
    
    //t1.initialize(); //初始化應該立即呼叫,如果沒有,則容易出錯
    
    printf("t1.i = %d\n", t1.getI());
    printf("t1.j = %d\n", t1.getJ());
    
    t1.initialize(); //呼叫時間不適合
    
    Test* pt = new Test;
    
    pt->initialize();
    
    printf("pt->i = %d\n", pt->getI());
    printf("pt->j = %d\n", pt->getJ());
    
    delete pt;
    
    return 0;
}
執行結果
gt.i = 1
gt.j = 2
t1.i = 1
t1.j = 2
pt->i = 1
pt->j = 2

存在的問題
initialize只是一個普通函式,必須顯示呼叫
如果未呼叫initialize函式,執行結果是不確定的

2.建構函式—可以自動被呼叫

C++中可以定義與類名相同的特殊成員函式
這種特殊的成員函式叫做建構函式
構造沒有任何返回型別的宣告
建構函式在物件定義時自動被呼叫

17-3 建構函式初探

#include <stdio.h>
class Test
{
private:
    int i;
    int j;
public:
    int getI() { return i; }
    int getJ() { return j; }
    Test()
    {
        printf("Test() Begin\n");
        
        i = 1;
        j = 2;
        
        printf("Test() End\n");
    }
};
Test gt;
int main()
{
    printf("gt.i = %d\n", gt.getI());
    printf("gt.j = %d\n", gt.getJ());
    
    Test t1;
    
    printf("t1.i = %d\n", t1.getI());
    printf("t1.j = %d\n", t1.getJ());
    
    Test* pt = new Test;
    
    printf("pt->i = %d\n", pt->getI());
    printf("pt->j = %d\n", pt->getJ());
    
    delete pt;
    
    return 0;
}
執行結果
Test() Begin
Test() End
gt.i = 1
gt.j = 2
Test() Begin
Test() End
t1.i = 1
t1.j = 2
Test() Begin
Test() End
pt->i = 1
pt->j = 2

小結
每個物件在使用之前都應該初始化
類的建構函式用於物件的初始化
建構函式與類同名並且沒有返回值
建構函式在物件定義時自動被呼叫