C 初識 類和物件(2)

2021-08-23 14:07:13 字數 3468 閱讀 8306

在之前的文章裡,我們出初步了解了,什麼是類,類如何定義,類的大小怎麼計算等

乙個空類裡面什麼也沒有,但是它並非是什麼也沒有,只要是類,它就有6個預設的成員函式:

1.建構函式

2.析構函式

3.拷貝建構函式

4.賦值操作符過載

5.取位址操作符過載

6.const修飾的取位址操作符過載

類的建構函式:

class date

//2.帶參建構函式

date(int year,int month,int day)

private:

int _year;

int _month;

int _day;

};void testdate()

帶預設參的建構函式

class date

//4.半預設引數的建構函式(不推薦)

date(int year,int month=1)

private:

int _year;

int _month;

int _day;

};void test()

析構函式

當乙個物件的生命週期結束的時候,c++編譯系統會自動呼叫乙個成員函式,這個成員函式即析構函式

特徵:1.析構函式名是在類名前加上字元 ~;

2.無引數無返回值;

3.乙個類有且只有乙個析構函式(說明析構函式不能過載);(若未顯示定義,系統會自動生成預設的析構函式)

4.物件生命週期結束時,c++編譯系統自動呼叫析構函式;

class date

;

析構函式內部不是刪除物件,而是做一些刪除物件前的清理工作

class myvector

//這裡析構函式需要完成清(shi)理(fang)工(kong)作(jian).

~myvector()

}private:

int *_ptr;

};

類的拷貝建構函式

建立物件時使用同類物件來進行初始化,這時所使用的建構函式稱為拷貝建構函式

特徵:1.拷貝建構函式是建構函式的乙個過載

2.拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值會引發無窮遞迴

3.若未顯示定義,系統會預設生成預設的拷貝建構函式。預設的拷貝建構函式會按照成員的宣告順序依次拷貝類成員進行初始化

class date

//拷貝建構函式

date(const date &d)

private:

int _year;

int _month;

int _day;

};void testdate1()

問題來了,為什麼拷貝建構函式的引數使用傳值會引發無窮遞迴?

問題是這樣,我們傳值進去的候,會先拷貝出乙個臨時變數,來進行初始化,而這個過程就是拷貝建構函式的過程,所以會一直在呼叫拷貝建構函式,引發無窮遞迴

運算子過載

為了增強程式的可讀性,c++支援運算子過載

特徵:1.operator+合成的運算子 構成函式名(operator

2.過載運算子以後,不能改變預算符的優先順序/結合性/運算元個數

class date

//拷貝建構函式

date(const date& d)

// == 操作符的過載

bool operator == (const date& d)

private:

int _year;

int _month;

int _day;

};void test()

這個地方我們要注意,在寫操作符過載函式的時候,引數中我們可以傳值,但為什麼要傳引用,因為傳值進去的話,在函式體內會先拷貝乙份臨時變數,但是傳引用就不需要,省去了這個步驟,因為傳引用基本上就和傳位址是類似的,但是,我們得保證傳進去的形參不改變實參的具體內容,所以得加上 const 修飾

另外,我們看看編譯器對 == 操作符的過載處理過程:

我們在使用 ==操作符過載時,編譯器實際上幫我們加了乙個引數,就是this指標,我們前面說過,this指標是隱式指標,我們看不見,但是我們要清楚,它一直指著物件。==操作符過載,我們需要兩個運算元,但是實際上我們只需要寫出乙個,因為編譯器會幫我們把this指標加上。

另外,c++中有5個不能過載的操作符:

類的賦值操作符過載

1.賦值運算子的過載是對乙個已存在的物件進行拷貝賦值

2.當程式沒有顯示地提供乙個以本類或本類的引用為引數的賦值運算子過載函式時,編譯器會自動生成這樣乙個賦值運算子過載函式

class date

//拷貝建構函式

date (const date& d)

//賦值操作符過載

date& operator = (const date& d)

return this;

}private:

int _year;

int _month;

int _day;

};void test()

賦值操作符過載為什麼要返回乙個引用呢?

為了進行連續賦值,即 x = y = z

1、賦值返回引用

x = y = z  先執行y = z,返回y的引用,執行x = y

2、賦值不返回引用

x = y = z  先執行y = z,返回用y初始化的臨時物件(注意臨時物件都是常物件),再執行x = y的臨時物件,返回用x初始化的臨時物件。

還有一點,if判斷不可少,這裡的判斷就是為了防止,將值賦給自己

類的const成員函式

const修飾普通變數

在c++中,const修飾的變數已經為乙個常量,具有巨集的屬性,即在編譯的時候,編譯器會將const所修飾的常量進行替換

const修飾類成員

1.const修飾類成員變數時,該成員變數必須在建構函式的初始化列表中初始化、

2.const修飾類成員函式時,實際修飾該成員隱含的this指標,該成員函式不能對類的任何成員進行修改

void testfunc()

const date* operator() const

private:

int _year;

int _month;

int _day;

};

只有在一種情況下,才需要你自己過載這兩個操作符,那就是你只想讓別人獲取到你指定的內容。

C 初識類和物件

在c語言中,結構體中只能定義變數,在c 中,結構體不僅可以定義變數,還可以定義函式。例如 struct student 這樣的結構體,在c 中常用class來代替。即類。類的定義 class classname 例 在定義類的時候,一般將成員函式的定義和類定義分開,跨檔案定義。即類外定義成員函式,類...

C 中的類和物件(一 初識類和物件)

面向過程和物件導向的初步認識 c語言是基於面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。c 是基於物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。class為定義類的關鍵字,person為類的名字,中為類的主體,注意類定義結束時後面的分號。類中...

C 初識類與物件

在c 中,結構體不僅可以定義變數時也可以定義函式。同樣的結構體c 中,將會用class代替struct class student 類的兩中定義方式 1.宣告和定義都在類體中 class student private int age char name 20 char gender 3 2.宣告放...