为什么班级名称和构造函数的名称相同

Why should Class names and Constructors names be the same

本文关键字:构造函数 为什么      更新时间:2023-10-16

因此,我最近开始学习面向对象的理论的基础,并一直通过Java实践。我的问题很简单,"为什么班级名称和构造函数应该是相同的?

现在我已经阅读了这个问题 ->

为什么构造函数始终具有与课堂相同的名称以及如何调用

,即使这种响应是有道理的,降低了关键字的使用,在我看来,能够以不同于班级独立于不同的命名构造函数更有意义。现在,如果我没记错的话(通过快速的Google有点验证)语法是这样的:

 className objectName = New constructorName(variables)

所以我的意思是您已经将要从中列为对象的类命名为"再次调用构造函数的同名"的意义是什么?您最好只写

 className objectName = New (vars); 

看到两者给出完全相同的信息。

在我看来,能够独立命名您的构造函数以了解它到底是什么,例如

  thisClass thisObject = New thisConstructorMakesThis(vars)

除了上面链接中给出的响应以外,还有其他文档确切地解释了为什么构造函数和类命名相同吗?

我还注意到,响应甚至没有明确提及的考虑,动态命名的构造函数,而不是"显式语法" ,它听起来更像是绝对的构造函数名称。

编写new Identifier时,Identifier不是构造函数的名称,而是类的名称。它通常与变量的类相同,但并非总是如此。变量的静态类型不必与正在实例化的类相匹配。例如:

Collection<Integer> numbers = new ArrayList<Integer>();

如果您不编写类名,而是写:

className objectName = new(vars);

在可变初始化的上下文之外会发生什么?如果您有一个Inline new调用,例如:

linkedList.next = new Node(value, null);

这里的Node不是冗余;这是班级的唯一提及。如果您要省略Node,编译器将如何知道要实例化的类?

至少在C 中,构造函数没有名称。需要某种语法来声明它们,并且决定使用诸如函数声明语法与类名称代替函数名称之类的内容。没有特定的原因是选择它而不是某些其他名称或某些完全不同的语法。

在任何其他情况下,类名称是指类,而不是构造函数。

Java和C#都从C 获得了许多语法,因此他们使用了相同的约定。其他语言使用其他惯例,例如python中的__init__

您不妨编写'className objectName = new(vars)',因为两者给出了完全相同的信息。

除了该变量并不总是对您创建的同一类的引用;这通常是对基类的引用:

base * thing = new derived;

因此,new-expression die 需要指定要创建的类型,与要称为。

的类型分开

此外,这些天您通常可以避免重复班级名称:

auto p = std::make_shared<thing>(vars);

当然,C 不会强迫您的动态分配:

thing t(vars);

在我看来,能够独立命名您的构造函数以了解它到底是什么

,这将是更大的语义。

,如果您需要比声明或新表达语法允许的允许的表现力更多,则可以随时写一个命名的"工厂"函数(例如make_shared)来创建和返回对象。

您可以具有不同命名的构造函数(尽管仍然隐藏在私有范围后面的默认构造函数。)

看单身人士...

mysingleton singleton = mysingleton.getInstance();

构造函数是一个特殊的函数,可以稳定类(创建对象),因此具有相同名称是完全合乎逻辑的。这就是C#定义的方式和其他语言。构造函数是特殊的东西。他们不能称呼它们,可以实例化。