C 學習 類和物件(二)

2021-08-21 08:27:32 字數 3635 閱讀 3324

先來看下面**

#include

using

namespace

std;

class person

;int main()

執行結果

[zyc@localhost lession_class]$ ./a.out 

jack-20-123456

rose-21-654321

為什麼呼叫同樣的函式,但是結果卻不一樣呢?

原因就在於this指標。

下面來看什麼是this指標。

1.概念

this指標是乙個隱含的指標,它是指向物件本身,代表了物件的位址。

正如你家有個人名叫「狗蛋」的,你隔壁家也有個人叫「狗蛋」。this就表示你自家的人,說明白一點就是你家的那個「狗蛋」。

隱含的指標的說法,可以形象化成這樣:

當你進入乙個房子後,你可以看見桌子、椅子、地板等,但是房子你是看不到全貌了。

對於乙個類的例項來說,你可以看到它的成員函式、成員變數,但是看不到例項本身。

this是乙個指標,它時時刻刻指向你這個例項本身。

即使呼叫相同的建構函式,但是由於呼叫時傳給this指標的例項物件不同,所以列印的物件也就不同,

開始 時this是例項p的位址。隨後this是例項point的位址。

2.this特性特性

每個成員函式都有乙個指標形參,它的名字是固定的,稱為this指標,this指標是隱式的。(建構函式和靜態成員函式比較特殊,沒有這個隱含this形

參)。編譯器會對成員函式進行處理,在物件呼叫成員函式時,物件位址作實參傳遞給成員函式的第乙個形參this指標。

this指標是成員函式隱含指標形參,是編譯器自己處理的,我們不能在成員函式的形參中新增this指標的引數定義,也不能在呼叫時

顯示傳遞物件的位址給this指標。

4.this指標是實參,呼叫函式時產生,所以this指標 存放在棧上

5.不可以顯示傳遞this,不識別,可以在函式裡面顯示寫this

6.有些平台為提高效率 將this指標存放在暫存器ecx中,下次要用直接在暫存器中取。比如windows.

1.建構函式

成員變數為私有的,要對它們進行初始化,必須用乙個公有成員函式來進行。同時這個函式應該有且僅在定義物件時自動執行一次,這時

呼叫的函式稱為建構函式(constructor)。

下面來看**

1)預設建構函式(編譯自動生成)

#include

using

namespace

std;

class data

;int main()

執行結果:

[zyc@localhost lession_class]$ ./a.out 

1376536704-32767-0

0-0-4196208

結果分析:預設建構函式,生成隨機值。一旦使用者自己定義建構函式,即使時無參的建構函式,系統也不會自動生成建構函式。

2)自定義建構函式

1.無參建構函式

2.帶參的建構函式(全預設引數,半預設引數)

#include

using

namespace

std;

class data

//帶參的建構函式

data(int year,int month,int day)

void display()

;int main()

#include

using

namespace

std;

class data

void display()

private:

int _year;

int _month;

int _day;

};int main()

[zyc@localhost lession_class]$ ./a.out

2018-7-10

//匿名物件

1900-1-1

//d1

2018-1-1

//d2

總結建構函式:建構函式是特殊的成員函式,其特徵如下:

函式名與類名相同。

無返回值。

物件構造(物件例項化)時系統自動呼叫對應的建構函式。

建構函式可以過載。

建構函式可以在類中定義,也可以在類外定義。

如果類定義中沒有給出建構函式,則c++編譯器自動產生乙個預設的建構函式,但只要我們定義了乙個建構函式,系統就不會自動

生成預設的建構函式。

無參的建構函式和全預設值的建構函式都認為是預設建構函式,並且預設的建構函式只能有乙個。

匿名物件也可以呼叫建構函式,匿名物件一般是一次性使用的物件。

析構函式

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

建構函式是特殊的成員函式,其特徵如下:

1. 析構函式在類名加上字元~。

2. 析構函式無引數無返回值。

3. 乙個類有且只有乙個析構函式。若未顯示定義,系統會自動生成預設的析構函式。建構函式可以有多個。

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

5. 注意析構函式體內並不是刪除物件,而是做一些清理工作。所謂清理通常指釋放一些malloc申請的空間,並將其置為空。防止記憶體洩露

6. 析構函式不可過載,過載沒有實際意義。

#include

#include

using

namespace

std;

class array

//這裡的析構函式需要完成清理工作(釋放空間)

~array()

}private:

int *ptr;

};

析構函式總結:

析構函式有自動生成和自定義兩種型別。一般有malloc等函式申請空間時最好使用自定義析構函式。

析構函式和建構函式比較

功能函式名

產生方式

是否可以過載

個數限制

建構函式

初始化變數

自動生成/自定義

可過載乙個類可以有多個建構函式

析構函式

清理工作

自動生成/自定義

不可過載

乙個類只有乙個析構函式

C 學習(七) 類和物件(二)

include using namespace std class myclass 2 析構函式的寫法 沒有返回值 不寫void 函式名與類名相同 在函式名稱前加 不可以有引數,不可以發生過載 由編譯器自動呼叫,不需要手動呼叫,編譯器也只呼叫一次 myclass void test01 intmai...

C 類和物件(二)

類和物件 類的物件如何引用私有資料成員 1 通過公有函式為私有成員賦值 class test void printxy void void main void 2 利用指標訪問私有資料成員 class test void getxy int px,int py 提取x,y值 void printxy...

C 類和物件(二)

隱含的this指標 1 每個成員函式都有乙個指標形參,它的名字是固定的,稱為this指標,this指標是隱式的。建構函式比較特殊,沒有這個隱含this形參 2 編譯器會對成員函式進行處理,在物件呼叫成員函式時,物件位址作實參傳遞給成員函式的第乙個形參this指標。3 this指標是成員函式隱含指標形...