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

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

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

第十八課 物件的構造(中)

1.建構函式

帶有引數的建構函式
建構函式可以根據需要定義引數
一個類中可以存在多個過載的建構函式
建構函式的過載遵循C++過載的規則
在這裡插入圖片描述
友情提示
物件定義和物件宣告不同
物件定義-申請物件的空間並呼叫建構函式
物件宣告-告訴編譯器存在這樣一個物件
在這裡插入圖片描述
建構函式的自動呼叫—在定義物件時
在這裡插入圖片描述

18-1 帶引數的建構函式

#include <stdio.h>
class Test
{
public:
    Test() 
    { 
        printf("Test()\n");
    }
    Test(int v) 
    { 
        printf("Test(int v), v = %d\n", v);
    }
};
int main()
{
    Test t;      // transfer Test()
    Test t1(1);  // transfer Test(int v)
    Test t2 = 2; // transfer Test(int v)
    
    int i(100);
    
    printf("i = %d\n", i);
    
    return 0;
}
執行結果
Test()
Test(int v), v = 1
Test(int v), v = 2
i = 100

在面向物件裡面,兩者存在差異
int i = 1; // 初始化—呼叫建構函式
int i; // i的初始值隨機
i = 1; // 賦值

建構函式的呼叫
一般情況下,建構函式在物件定義時被自動呼叫
一些特殊情況下,需要手工呼叫建構函式
如何建立一個物件陣列?

18-2 建構函式的手動呼叫

#include <stdio.h>
class Test
{
private:
    int m_value;
public:
    Test() 
    { 
        printf("Test()\n");
        
        m_value = 0;
    }
    Test(int v) 
    { 
        printf("Test(int v), v = %d\n", v);
        
        m_value = v;
    }
    int getValue()
    {
        return m_value;
    }
};
int main()
{
    Test ta[3] = {Test(), Test(1), Test(2)};      
    
    for(int i=0; i<3; i++)
    {
        printf("ta[%d].getValue() = %d\n", i , ta[i].getValue());
    }
    
    Test t = Test(100);
    
    printf("t.getValue() = %d\n", t.getValue());
    
    return 0;
}
執行結果
 v), v = 2
ta[0].getValue() = 0
ta[1].getValue() = 1
ta[2].getValue() = 2
Test(int v), v = 100
t.getValue() = 100

2.小例項

需求:開發一個數組類解決原生陣列的安全性問題
提供函式獲取陣列長度
提供函式獲取陣列元素
提供函式設定陣列元素
IntArray== 陣列類==的實現 IntArray.cpp IntArray.h main.cpp
小結
建構函式可以根據需要定義引數
建構函式之間可以存在過載關係
建構函式遵循C++中過載函式的規則
物件定義時會觸發建構函式的呼叫
在一些情況下可以手動呼叫建構函式