先來看下面**
#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指標是成員函式隱含指標形...