2014-03-25 132 views
4

請給我一個合乎邏輯的答案,命名構造函數具有相同的名稱。爲什麼我們不能爲構造函數選擇除類名之外的其他名稱?Java中的構造函數名稱和類名稱相同。爲什麼?

class Temp 
{ 
    Temp() 
    { 

    } 
}; 
+0

您可以參考該文章 http:// stackoverflow。com/questions/3401444/methods-with-same-name-as-constructor-why – Dipika

+0

第一個dup不是特定於語言的,第二個是針對Java的。這個問題值得一個很好的,單獨的答案。 – Potatoswatter

+0

@Patatoswatter:第一個dup不是語言特定的,但接受的答案引用了Stroustrup對其推理的解釋。 –

回答

4

構造函數名與類名相同只是一個約定。邏輯一太 - 考慮對象可以構造這樣也

Temp t = Temp(); 

它可能已被稱爲constructor()但當時如果你正在尋找的只是片斷你不知道它是什麼構造?

+0

+1,如果你可以寫'Temp t = SomeOtherName()'但仍然意味着Temp –

+0

那麼這個語法可能會是'Temp t = Temp :: foobar();'或其他。 – fredoverflow

6

因爲此語法不需要任何新的關鍵字。除此之外,沒有什麼好的理由。

爲了儘量減少新的關鍵字數量,我沒有用明確的語法如下:

class X { 
    constructor(); 
    destructor(); 
} 

相反,我選擇了鏡像構造的使用聲明的語法。

class X { 
    X(); 
    ~X(); 

這可能過於聰明。 [設計與進化的C++,3.11.2構造符號]

1

根據其定義了C++語言,構造不具有名稱,至少不會在標識符的意義上的標準,其通過聲明宣佈(聲明者編號)。它是一種用特定語法聲明的匿名函數,並且只在特定情況下通過更特殊的語法才被引用。在其他情況下,相同術語Temp::Temp指的是class Temp本身。

該構造函數使用名爲注入類名稱的成員聲明進行聲明。可以使用::標點符號(嵌套名稱說明符)使用的注入類名稱或其他類型名稱以type::type的形式進行引用,最後兩個::-限定的部分具有相同的標記,特定的上下文,如委託和繼承構造函數。

所有這一切的原因是,您不能對構造函數進行引用,例如獲取指向它的函數指針或者在不創建新對象的情況下調用它。構造函數與對象的生命週期有着內在的聯繫。

從歷史上看,構造函數從工廠函數發展而來,它返回給定類型的初始化對象。這種模式,其中函數名可能是別名類型和構造函數,僅僅是約定,在某些語言中仍然可以看到。當前的語法是從您在JavaScript中看到的內容演變而來的。一些早期的C++編譯器(思考C,不確定Cfront的最早版本)並沒有將構造函數視爲成員。

相關問題