類初始化時 this 指標何時生成,在建構函式中如何確保 this 指標有效?

時間 2021-05-31 10:15:44

1樓:靈劍

this就是個指標,當然不存在準備沒準備好的問題了,就算隱式使用欄位和方法也是相當於使用了指標啊……

主要是這樣幾個問題:

1. 建構函式沒執行完的時候,不一定所有欄位都正確初始化了2. 基類建構函式執行時,子類的虛函式表沒有初始化,此時呼叫虛函式不能進入子類實現,如果是純虛函式甚至會直接崩潰

你只儲存個指標位址當然不會出什麼事。不要把所謂法則變成玄學,要去理解它背後的道理。

2樓:雞賊軒主

classC:

public

Bprivate:T

member_;};

classD:

public

C{};

在《引數列表》中,物件還沒有開始構造

在《初始化列表》開始執行前,物件位址已經確定,物件還沒有開始構造

在《初始化列表》中,物件進行構造(初始化基類B和資料成員member_)

在《建構函式體》開始執行前,物件已經構造完畢

所以,(在《引數列表》中,不可能使用this,不過這個與本題無關)

在《初始化列表》中,可以使用this獲取物件位址,但盡量不要呼叫this的成員函式或訪問this的資料成員。

在《建構函式體》中,既可以使用this獲取物件位址,又可以呼叫this的成員函式或訪問資料成員。

需要注意的一點是,在《建構函式體》中呼叫this的虛函式,會使用當前類C的實現(或基類B的實現,如果C沒有過載它的話),不會使用派生類D的實現。原因很簡單,因為C的建構函式執行時,D還沒有構造完畢。

3樓:秦.no9

1.在建構函式執行之前完成了空間(記憶體)分配,如果沒有建構函式,則物件以未初始化的形式開始生存週期。

2.既然已經完成了空間分配,且在執行建構函式。則類與類例項的位址已知,this儲存的位址可用。同理所有類靜態變數、成員資料的位址有效,可訪問。

3.不清楚其他問題中的建構函式列表是啥?是類字面量麼?

4樓:expinc

新建乙個物件的過程:

1、為這個物件分配空間

2、呼叫這個物件的建構函式

只要步驟1完成了,this指標就ready了,所以並不需要等到物件構造完畢,所以在建構函式內是可以使用this指標的

5樓:cutcat

需要保證的只是依賴的成員有效,就像第乙個例子onUnknownMessage不依賴codec_,所以直接在codec_還沒構造的時候把介面扔給dispatcher_用也是沒問題的

6樓:Ivony

this指標當然是一開始就可用的,書上告訴你的應該是不要在建構函式中把this指標給公布出去,因為這時候物件還沒初始化完成。

7樓:諸葛不亮

在建構函式執行的那個時間點,物件記憶體已經分配完畢,this指標是有效的。

建構函式中,初始化列表結束,進入大括號作用域後,所有成員物件的建構函式也已經執行完畢,全部可用。

但如果是初始化列表中,要慎重,因為此時成員物件還未初始化完畢(比如有建構函式的成員物件)。

建構函式執行過程中,物件的資料還沒準備好,這個是邏輯意義上的「不可用」,但在語法層面上,this指標已經可用。

8樓:陳碩

誰告訴你「在建構函式中使用this指標會存在問題,應該盡量避免」?

如果建構函式裡不准用 this 指標,你打算如何實現以下功能?

struct Node};

9樓:fe263

構造一開始this就指向有效的記憶體塊,只不過在初始化列表中成員通常沒初始化完成,比如loop_宣告在dispatcher_前面的話,就不要在初始化列表中用dispatcher_(或其它後面宣告的成員)了.

進入建構函式後,成員可以任意順序使用.因為它們都初始化過了(如果你在初始化列表中顯示指定就呼叫過預設構造了)

c 臨時物件初始化指標和引用?

楚軒 1.因為你開啟了VS2013的非標準擴充套件.你把警告等級W4開了就知道了.這是微軟搞得 2.一樣是非標準擴充套件nonstandard extension used class rvalue used as lvalue 邱昊宇 出現這種疑問時,可以嘗試換個編譯器 比如 g main.cpp...

C 類本身的初始化和靜態欄位的初始化到底發生在什麼時候?

餘葉 其實就兩個構造器。乙個是靜態的,乙個是普通的。靜態構造器得需要你第一次訪問到該類的時候會被觸發。建立的時候,包括 static 成員變數的初始化和static構造器,其實 static 成員變數會整合進static構造器裡面的。而普通成員變數也會整合進普通構造器裡面的。 天煞 如 Sai說的,...

c 類的建構函式初始化問題??

Right If you don t specify any constructors,the compiler will write one for you that doesn t take any arguments.This compiler generated default constr...