溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++---對(duì)象的構(gòu)造

發(fā)布時(shí)間:2020-07-31 12:10:06 來(lái)源:網(wǎng)絡(luò) 閱讀:244 作者:淡淡_小孩 欄目:編程語(yǔ)言

一.對(duì)象的構(gòu)造(上)

Q:對(duì)象中成員變量的初始值是多少?

#include <iostream>

using namespace std;

class Test
{
    private:
        int i;
        int j;
    public:
        int getI()
        {
            return i;
        }
        int getJ()
        {
            return j;
        }
};

int main()
{
    Test t1;

    cout<<"t1.getI()="<<t1.getI()<<endl;
    cout<<"t1.getJ()="<<t1.getJ()<<endl;
}

輸出的結(jié)果為
C++---對(duì)象的構(gòu)造

#include <iostream>

using namespace std;

class Test
{
    private:
        int i;
        int j;
    public:
        int getI()
        {
            return i;
        }
        int getJ()
        {
            return j;
        }
};

Test gt;

int main()
{
    cout<<"gt.getI()="<<gt.getI()<<endl;
    cout<<"gt.getJ()="<<gt.getJ()<<endl;

    Test t1;

    cout<<"t1.getI()="<<t1.getI()<<endl;
    cout<<"t1.getJ()="<<t1.getJ()<<endl;

    Test* pt = new Test;

    cout<<"pt->getI()="<<pt->getI()<<endl;
    cout<<"pt->getJ()="<<pt->getJ()<<endl;

    delete pt;

    return 0;

}

結(jié)果如圖
C++---對(duì)象的構(gòu)造
小結(jié)
從程序設(shè)計(jì)的角度,對(duì)象只是變量
1.在棧上創(chuàng)建對(duì)象時(shí),成員變量初始為隨機(jī)值
2.在堆上創(chuàng)建對(duì)象時(shí),成員變量初始值為隨機(jī)值
3.在靜態(tài)區(qū)創(chuàng)建對(duì)象時(shí),成員變量初始值為0值

解決方案:
1.在類中提供一個(gè)public的intialize函數(shù)
2.對(duì)象創(chuàng)建后立即調(diào)用intialize函數(shù)進(jìn)行初始化
示例

#include <iostream>

using namespace std;

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();
    cout<<"gt.getI()="<<gt.getI()<<endl;
    cout<<"gt.getJ()="<<gt.getJ()<<endl;

    Test t1;
    //t1.initialize();
    cout<<"t1.getI()="<<t1.getI()<<endl;
    cout<<"t1.getJ()="<<t1.getJ()<<endl;
    t1.initialize();

    Test* pt = new Test;
    pt->initialize();
    cout<<"pt->getI()="<<pt->getI()<<endl;
    cout<<"pt->getJ()="<<pt->getJ()<<endl;

    delete pt;

    return 0;

}

運(yùn)行結(jié)果
C++---對(duì)象的構(gòu)造
Q:當(dāng)intialize的位置出現(xiàn)了改變的話,還會(huì)對(duì)其進(jìn)行初始化嗎
C++---對(duì)象的構(gòu)造C++---對(duì)象的構(gòu)造
輸出結(jié)果如圖所示,發(fā)現(xiàn)intialize位置改變了之后,初始化也出現(xiàn)了問(wèn)題
存在的問(wèn)題
1.intialize只是一個(gè)普通函數(shù),必須顯示調(diào)用
2.如果為調(diào)用intialize函數(shù),運(yùn)行結(jié)果是不確定的
解決方法
C++中可以定義與類名相同的特殊成員函數(shù)--這種特殊的成員函數(shù)叫做構(gòu)造函數(shù)
1.構(gòu)造函數(shù)沒(méi)有任何返回類型的聲明
2.構(gòu)造函數(shù)在對(duì)象定義時(shí)自動(dòng)被調(diào)用

示例

#include <iostream>

using namespace std;

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()
{

    cout<<"gt.getI()="<<gt.getI()<<endl;
    cout<<"gt.getJ()="<<gt.getJ()<<endl;

    Test t1;

    cout<<"t1.getI()="<<t1.getI()<<endl;
    cout<<"t1.getJ()="<<t1.getJ()<<endl;
    t1.initialize();

    Test* pt = new Test;

    cout<<"pt->getI()="<<pt->getI()<<endl;
    cout<<"pt->getJ()="<<pt->getJ()<<endl;

    delete pt;

    return 0;

}

運(yùn)行結(jié)果
C++---對(duì)象的構(gòu)造
小結(jié)
1.每個(gè)對(duì)象在使用之前都應(yīng)該初始化
2.類的構(gòu)造函數(shù)用于對(duì)象的初始化
3.構(gòu)造函數(shù)與類同名并且沒(méi)有返回值
4.構(gòu)造函數(shù)在對(duì)象定義時(shí)自動(dòng)被調(diào)用

二.對(duì)象的構(gòu)造(中)

帶有參數(shù)的構(gòu)造函數(shù)
1.構(gòu)造函數(shù)可以根據(jù)需要定義參數(shù)
2.一個(gè)類中可以存在多個(gè)重載的構(gòu)造函數(shù)
3.構(gòu)造函數(shù)的重載遵循C++重載的規(guī)則
對(duì)象定義和對(duì)象聲明不同
1.對(duì)象定義--申請(qǐng)對(duì)象的空間并調(diào)用構(gòu)造函數(shù)
2.對(duì)象聲明--告訴編譯器存在這樣一個(gè)對(duì)象
示例

#include <iostream>
using namespace std;

class Test
{
public:
    Test() 
    { 
        cout<<"Test()"<<endl;;
    }
    Test(int v) 
    { 
        cout<<"Test(int v)="<<v<<endl;
    }
};

int main()
{
    Test t;      // 調(diào)用 Test()
    Test t1(1);  // 調(diào)用 Test(int v)
    Test t2 = 2; // 調(diào)用 Test(int v)

    int i(100);

    cout<<"i="<<i<<endl;

    return 0;
}

結(jié)果
C++---對(duì)象的構(gòu)造
小結(jié)
1.構(gòu)造函數(shù)可以根據(jù)需要定義參數(shù)
2.構(gòu)造函數(shù)之間可以存在重載關(guān)系
3.構(gòu)造函數(shù)遵循C++中重載函數(shù)的規(guī)則
4.對(duì)象定義時(shí)會(huì)觸發(fā)構(gòu)造函數(shù)的調(diào)用
5.在一些情況下可以手動(dòng)調(diào)用構(gòu)造函數(shù)

三.特殊的構(gòu)造函數(shù)

1.無(wú)參構(gòu)造函數(shù)--沒(méi)有參數(shù)的構(gòu)造函數(shù),當(dāng)類中沒(méi)有定義構(gòu)造函數(shù)時(shí),編譯器默認(rèn)提供一個(gè)無(wú)參構(gòu)造函數(shù),并且其函數(shù)體為空
2.拷貝構(gòu)造函數(shù)--參數(shù)為const class_name&的構(gòu)造函數(shù),當(dāng)類中沒(méi)有定義拷貝構(gòu)造函數(shù)時(shí),編譯器默認(rèn)提供一個(gè)拷貝構(gòu)造函數(shù),簡(jiǎn)單的進(jìn)行成員變量的值的復(fù)制

拷貝構(gòu)造函數(shù)的意義
1.兼容C語(yǔ)言的初始化方式
2.初始化行為能夠符合預(yù)期的邏輯
3.淺拷貝--拷貝后的物理狀態(tài)相同
4.深拷貝--拷貝后的邏輯狀態(tài)相同
小結(jié)
1.C++編譯器會(huì)默認(rèn)提供構(gòu)造函數(shù)
2.無(wú)參構(gòu)造函數(shù)用于定義對(duì)象的默認(rèn)初始狀態(tài)‘
3.拷貝構(gòu)造函數(shù)在創(chuàng)建對(duì)象時(shí)拷貝對(duì)象的狀態(tài)
4.對(duì)象的拷貝由淺拷貝和深拷貝兩種方式

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI