2014-03-25 72 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的最早版本)并没有将构造函数视为成员。

相关问题