課堂筆記(類,構造,析構)

知識點1【類的空間大小】

using namespace std;

class Data

{

private:

    //成員數據 佔類的空間大小

    int num;//4B

public:

    

    //成員函數 不佔類的空間大小

    void setNum(int data)

    {

        num = data;

    }

    int getNum(void)

    {

        return num;

    }

};

void test01()

{

    printf("%d\n",sizeof(Data));//4B

}

知識點2【在類內聲明 類外定義 成員函數

#include <iostream>


using namespace std;

class Data

{

private:

    //成員數據 佔類的空間大小

    int num;//4B

public:


    //成員函數 在類內 聲明 類外定義

    void setNum(int data);

    int getNum(void);

};


//Data類的成員函數

void Data::setNum(int data)

{

    num = data;

}


int Data::getNum()

{

    return num;

}


void test01()

{

    printf("%d\n",sizeof(Data));//4B


    Data ob;

    ob.setNum(100);

    cout<<"num = "<<ob.getNum()<<endl;

}

int main(int argc, char *argv[])

{

    test01();

    return 0;

}



知識點4【構造和析構函數的概述】
構造函數和析構函數,這兩個函數將會被編譯器自動調用,構造函數完成對象的初始化動作,析構函數在對象結束的時候完成清理工作。
注意:對象的初始化和清理工作是編譯器強制我們要做的事情,即使你不提供初始化操作和清理操作,編譯器也會給你增加默認的操作,只是這個默認初始化操作不會做任何事。
構造函數:實例化對象的時候系統自動調用
析構函數:對象釋放的時候系統自動調用

知識點5【構造和析構函數定義】(重要)
構造函數語法:
構造函數函數名和類名相同,沒有返回類型,連void都不可以,但可以有參數,可以重載
析構函數語法:
析構函數函數名是在類名前面加”~”組成,沒有返回類型,連void都不可以,不能有參數,不能重載

知識點6【構造函數的分類以及調用】
1、構造函數分類:
按參數類型:分爲無參構造函數和有參構造函數
按類型分類:普通構造函數和拷貝構造函數(複製構造函數)
2、構造函數的調用
注意:在同一作用域 構造和析構的順序相反

class Data

{

public:

    int num;

public:

    //構造函數(無參的構造)

    Data()

    {

        num = 0;

        cout<<"無參的構造函數 num = "<<num<<endl;

    }

    //構造函數(有參的構造)

    Data(int n)

    {

        num = n;

        cout<<"有參的構造函數 num = "<<num<<endl;

    }


    //析構函數(沒有返回值類型 沒有參數 不能重載)

    ~Data()

    {

        cout<<"析構函數 num = "<<num<<endl;

    }


};

void test02()

{

    //調用無參 或 默認構造 (隱式調用)

    Data ob1;

    //調用無參構造 (顯示調用)

    Data ob2 = Data();


    //調用有參構造(隱式調用)

    Data ob3(10);

    //調用有參構造(顯示調用)

    Data ob4 = Data(20);


    //隱式轉換的方式 調用有參構造(針對於 只有一個數據成員)(儘量別用)

    Data ob5 = 30;//轉化成Data ob5(30)


    //匿名對象(當前語句結束 匿名對象立即釋放)

    Data(40);

    cout<<"------"<<endl;

}

運行結果:
在這裏插入圖片描述
3、拷貝構造函數(系統提供一個拷貝構造函數 賦值操作)

//拷貝構造函數

Data(const Data &ob)//const Data &ob = ob1

{

    //拷貝構造函數 是ob2調用 num就是ob2的num

    //ob2.num = ob1.num

    num = ob.num;

    cout<<"拷貝構造"<<endl;

}
void test03()

{

    Data ob1(10);

    cout<<"ob1.num = "<<ob1.num<<endl;


    //調用拷貝構造函數(如果用戶  不實現拷貝構造 系統將調用默認的拷貝構造)

    //默認的拷貝構造:單純的整體賦值(淺拷貝)

    //如果用戶實現了 拷貝構造 系統將調用用戶實現的拷貝構造


    Data ob2(ob1);//隱式調用拷貝構造函數

    cout<<"ob2.num = "<<ob2.num<<endl;


    Data ob3 = Data(ob1);//顯示調用拷貝構造函數

    cout<<"ob3.num = "<<ob3.num<<endl;


    Data ob4 = ob1;//=隱式轉換調用

    cout<<"ob4.num = "<<ob4.num<<endl;

}

運行結果:

在這裏插入圖片描述記住一句話:舊對象 初始化 新對象 纔會調用拷貝構造函數。

Data ob1(10);


Data ob2(ob1);//拷貝構造

Data ob3 = Data(ob1);//拷貝構造

Data ob4 = ob1;//拷貝構造函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章