2012-11-23 57 views
2

構造函數從下往上(成員優先)爲類的成員 函數組裝執行環境。破壞者從上而下將它拆開(最後成員)。構造函數與析構函數環境彙編

[從C++語言編程]

請可有人形容呢?我明白,成員職能在這裏表示成員的職能,但首先是什麼「成員」?這與堆棧上的函數有關嗎?什麼意思是「組裝執行環境」?

回答

3

這句話是相當抽象的。一個成員函數的執行環境是該類本身的成員和由其中一個基類公開的成員。

假設「彙編執行環境」的意思是初始化類的所有成員和基礎(注意成員函數不需要初始化)。

我不明白這是如何與一個對象在堆棧上或不相關。

一個例子:

class X { 
public: 
    X() // constructor initializes first a, then b, then c 
    { 
    // members are now accessible for member functions 
    foo(); 
    } 

    void foo() { 
    // member function executes in the context of an object 
    // a, b, and c mean this->a, this->b and this-> 
    std::cout << a << b << c << std::endl; 
    } 

    ~X() {} // destroys first c, then b and then a 
private: 
    int a; 
    double b; 
    char c; 
}; 

請注意,你不需要寫出來的 上述情況下的析構函數。這僅僅是爲了示例目的。

+1

請注意,「成員函數不需要初始化」並不完全正確。虛擬成員需要初始化或不能被調用。實際上,通過在子類的構造器中調用虛函數,您可以看到正在討論的效果。類A從B類派生,然後調用B :: func(),假定func()是一個虛函數,應該調用A :: func(),但是在運行B :: B()時並不是這樣,因爲func()仍然只是一個指向B :: func()的指針,還不是指向A :: func()的指針。同樣,在B ::〜B()調用B :: func()不會調用A :: func()! –

+0

@AlexisWilke好點,我害怕把它帶到這裏,因爲它讓事情變得更加混亂。 – pmr

6

這意味着在構造函數中,首先構造類的成員子對象,然後運行構造函數的主體。與析構函數相反,它是相反的。首先運行析構函數的主體,然後銷燬成員子對象。

「成員函數的執行環境」只是成員函數可以被定義的行爲調用的環境。該環境是成員子對象是有效構造對象的環境。所以要「爲成員函數組裝執行環境」,就是運行構造函數。這只是花語言。

+0

沒有。這是真的,但是正如你在書中所說的那樣,它幾乎被逐字地描述。那麼這個額外的信息會被添加到關於彙編的信息中所以這是更多 – 4pie0

+1

@ cf16:construct = assemble,destruct = destroy = disassemble –

+0

我不認爲有平等。我認爲這可能會令人困惑。什麼理由先說明它是怎麼回事,然後用「彙編」代替構造 – 4pie0

0

我認爲「成員」是指變量,所以當一個類被調用構造函數時,它首先創建變量,然後爲類對象的執行函數設置環境,因爲它們可能依賴於成員變量。

函數的「彙編執行環境」表示首先初始化成員變量,因此可以在成員函數中調用它們。

儘管析構函數首先破壞了類對象所有函數的環境,然後銷燬了成員變量。