請給我一個合乎邏輯的答案,命名類和構造函數具有相同的名稱。爲什麼我們不能爲構造函數選擇除類名之外的其他名稱?Java中的構造函數名稱和類名稱相同。爲什麼?
class Temp
{
Temp()
{
}
};
請給我一個合乎邏輯的答案,命名類和構造函數具有相同的名稱。爲什麼我們不能爲構造函數選擇除類名之外的其他名稱?Java中的構造函數名稱和類名稱相同。爲什麼?
class Temp
{
Temp()
{
}
};
構造函數名與類名相同只是一個約定。邏輯一太 - 考慮對象可以構造這樣也
Temp t = Temp();
它可能已被稱爲constructor()
但當時如果你正在尋找的只是片斷你不知道它是什麼構造?
+1,如果你可以寫'Temp t = SomeOtherName()'但仍然意味着Temp –
那麼這個語法可能會是'Temp t = Temp :: foobar();'或其他。 – fredoverflow
因爲此語法不需要任何新的關鍵字。除此之外,沒有什麼好的理由。
爲了儘量減少新的關鍵字數量,我沒有用明確的語法如下:
class X { constructor(); destructor(); }
相反,我選擇了鏡像構造的使用聲明的語法。
class X { X(); ~X();
這可能過於聰明。 [設計與進化的C++,3.11.2構造符號]
根據其定義了C++語言,構造不具有名稱,至少不會在標識符的意義上的標準,其通過聲明宣佈(聲明者編號)。它是一種用特定語法聲明的匿名函數,並且只在特定情況下通過更特殊的語法才被引用。在其他情況下,相同術語Temp::Temp
指的是class Temp
本身。
該構造函數使用名爲注入類名稱的成員聲明進行聲明。可以使用::
標點符號(嵌套名稱說明符)使用的注入類名稱或其他類型名稱以type::type
的形式進行引用,最後兩個::
-限定的部分具有相同的標記,特定的上下文,如委託和繼承構造函數。
所有這一切的原因是,您不能對構造函數進行引用,例如獲取指向它的函數指針或者在不創建新對象的情況下調用它。構造函數與對象的生命週期有着內在的聯繫。
從歷史上看,構造函數從工廠函數發展而來,它返回給定類型的初始化對象。這種模式,其中函數名可能是別名類型和構造函數,僅僅是約定,在某些語言中仍然可以看到。當前的語法是從您在JavaScript中看到的內容演變而來的。一些早期的C++編譯器(思考C,不確定Cfront的最早版本)並沒有將構造函數視爲成員。
您可以參考該文章 http:// stackoverflow。com/questions/3401444/methods-with-same-name-as-constructor-why – Dipika
第一個dup不是特定於語言的,第二個是針對Java的。這個問題值得一個很好的,單獨的答案。 – Potatoswatter
@Patatoswatter:第一個dup不是語言特定的,但接受的答案引用了Stroustrup對其推理的解釋。 –