1. 程式人生 > >c++::讓你足夠了解建構函式和this指標

c++::讓你足夠了解建構函式和this指標

一、  this指標

【特性】
1、this指標的型別 類型別*const(類名*const,為右值2、this指標並不是物件本身的一部分,不影響sizeof的結
果。
3、this的作用域在類成員函式的內部。
4、this指標是類成員函式的第一個預設隱含引數,編譯
器自動維護傳遞,類編寫者不能顯式傳遞。
5、只有在類的非靜態成員函式中才可以使用this指標,其它任何函式都不可以

6. this指標本身不佔用大小,它並不是物件的一部分,因此不會影響sizeof的結果。

【_thiscall約定】

__thiscall呼叫約定:
a、__thiscall只能夠用在類的成員函式上。
a、引數從右向左壓棧。
b、如果引數個數確定,this指標通過ecx傳遞給被呼叫者;如果引數不確定,this指標在所有引數被壓棧後壓入堆疊。
c、對引數個數不定的,呼叫者清理堆疊,否則函式自己清理堆疊

【補充小結】

1)this指標時刻指向物件

2)是類成員函式第一個預設的隱含引數

3)引用和this:

因為引用的型別也是類名*const  所以其實引用也可以做到

4)this指向空時,是不會指向物件的

二、 建構函式

1、       定義:是一個特殊的成員函式,名字與類名相同,創
建類型別物件時,由編譯器自動呼叫,在物件的生命週期內只且只調用一次,以保證每個資料成員都有一個合適的初始值.

2、【建構函式特性】
1、函式名與類名相同。
2、沒有返回值。
3、有初始化列表(可以不用)。
4、新物件被建立,由編譯器自動呼叫,且在物件的生命期
內僅呼叫一次。
5、建構函式可以過載,實參決定了呼叫那個建構函式。
6、如果沒有顯式定義時,編譯器會提供一個預設的構造函
數。
7、無參建構函式和帶有預設值得建構函式都認為是預設構
造函式,並且預設建構函式只能有一個。

3、【初始化列表】
初始化列表:以一個冒號開始,接著是一個以逗號分隔的資料成員列表,每個資料成員後面跟一個放在園括號中的初始化式

  【初始化順序】:
1、每個成員在初始化列表中只能出現一次。(為什麼?)
2、初始化列表僅用於初始化資料成員,並不指定這些資料
成員的初始化順序,資料成員在類中定義順序就是在引數列表中的初始化順序。
3、儘量避免使用成員初始化成員,成員的初始化順序最好
和成員的定義順序保持一致

類中包含以下成員必須要放在初始化列表中初始化:】
1、引用資料成員
2、const資料成員
3、類型別成員(該類沒有預設的建構函式)

4、建構函式為什麼不能用const來修飾?

答:建構函式沒有返回值,你定義

const變成指向類本身,那麼你對成員的賦值操作都是非法的,成員無法操作這個類無用

5、【預設建構函式】

類如果沒有顯式定義建構函式時,編譯器會合成一個預設的建構函式,該建構函式中什麼工作都不做。只要顯式定義了,即使該建構函式什麼也不做,編譯器也不會為該類合成預設的建構函式。

編譯器生成的預設建構函式使用與變數初始化相同的規則來初始化成員,具有類型別的成員通過執行各自的預設建構函式來進行初始化。

內建和複合型別的成員如指標、陣列,只對定義在全域性作用域中的物件初始化,當物件定義在區域性作用域時,內建和符合型別的成員不進行初始化。在某些情況下,預設建構函式是由編譯器隱式使用的。

6、【建構函式作用】:
1、構建物件
2、初始化物件
3、型別轉換
【explicit】
用explicit修飾建構函式,抑制由建構函式定義的隱式轉換,explicit關鍵字類內部的構建宣告上,在類的定義體外部的定義上不再重複

7、編譯器會在需要的時候合成建構函式

1)A類包含B類,A類無,B類有預設,則編譯器會為A類合成一個建構函式

2)待續。。。