请给我一个合理的答案,用同名命名类和构造函数。为什么我们不能为构造函数选择除类名之外的其他名称?
class Temp
{
Temp()
{
}
};
答案 0 :(得分:7)
因为此语法不需要任何新关键字。除此之外,没有充分的理由。
为了尽量减少新关键字的数量,我没有使用这样的显式语法:
class X { constructor(); destructor(); }
相反,我选择了一个声明语法,它反映了构造函数的 use 。
class X { X(); ~X();
这可能过于聪明了。 [C ++的设计和演变,3.11.2构造函数表示法]
答案 1 :(得分:6)
与类名相同的构造函数名称只是一种约定。也是一个逻辑 - 考虑对象也可以这样构造
Temp t = Temp();
它可能被称为constructor()
,但如果您只查看代码段,则不知道它构建的内容是什么?
答案 2 :(得分:2)
根据定义C ++语言的标准,构造函数没有名称,至少不是由声明声明的标识符(声明符 - ID )。它是使用特定语法声明的匿名函数,仅在某些情况下通过更特殊的语法引用。在其他情况下,相同的术语Temp::Temp
指的是class Temp
本身。
使用命名立即注入类名的成员声明声明构造函数。它可以通过注入类名称或与::
标点符号(嵌套名称说明符)一起使用的type::type
形式的其他类型名称引用,最后两个::
- 分隔的部分是相同的标记,特别是上下文,例如委托和继承构造函数。
所有这一切的原因是你不能引用一个构造函数,比如获取一个函数指针或者在不创建新对象的情况下调用它。构造函数本质上与对象生命周期联系在一起。
历史上,构造函数是从工厂函数演化而来的,它返回给定类型的初始化对象。这种模式,其中函数名称可能是别名类型和构造函数仅仅是惯例,在某些语言中仍然可以看到。当前语法是从您在JavaScript中看到的内容演变而来的。一些早期的C ++编译器(考虑THINK C,不确定最早的Cfront版本)并没有将构造函数视为成员。