给构造函数命名有什么意义

What is the sense in giving names to constructors

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

我已经使用C++和Java好几年了。我似乎无法理解的一件事是,为什么我们需要为类的构造函数提供一个名称?例如,如果我必须在 C++/Java 中定义一个类FOO,我将被迫提供 FOO 作为构造函数名称。但是,由于构造函数从未被显式调用,因此编译器毕竟迫使我为其提供名称有什么意义。

抽象范式规定,我们对程序员隐藏不必要的细节。这就是构造函数没有返回类型的原因,因为它已经明确定义了构造函数必须返回的内容。本着同样的精神,为什么我们不能为所有类的构造函数提供一个通用名称 - 例如任何有意义的东西,比如initialize(),或者可能什么都没有,只是参数( [arg [,arg]] )

我希望,我能够表达自己。如果有人有任何明确的答案,请告诉我。

在C++中,构造函数没有名称(C++03 12.1),但是由于构造函数本质上被定义为函数,因此以某种方式命名它们是合乎逻辑的。
将它们命名为类名以外的任何名称都会添加新的关键字,因此最终它们的名称与类名相同。
简而言之,这是一个合乎逻辑的决定,避免了新关键字,同时确保了直观性。

从C++标准(12.1)(强调我的):

构造函数没有名称。特殊的声明符语法用于声明或定义构造函数。语法使用:

  • 一个可选的 decl-specifier-seq,其中每个 decl-specifier 要么是函数说明符,要么是 constexpr,
  • 构造函数的类名,以及
  • 参数列表

在C++中,您没有提供名称,而是编写由语言创建者决定声明构造函数的特殊语法。

它是

该语言的标准,如果你想为构造函数提供一个通用名称,那么尝试学习另一种语言,或者创建自己的语言。 =p

对于 Java 和 C++,构造函数名称必须与类名相同。此外,您知道它是一个构造函数,因为它不声明返回类型。这种声明构造函数的方式有助于声明名称为 __init__initialize__constructor 的方法。例如,这在 Python 中是不可能的,因为它使用 __init__ 作为构造函数名称。

构造函数是特殊的成员函数,构造函数始终返回由"new"运算符创建的内存地址。由于一个函数一次只返回一件事,因此没有其他值可以从构造函数返回。 定义与类名相同的构造函数名称是 Java 标准。

首先,您不必编写构造函数。如果你不写一个 - 编译器将为你创建一个默认的构造函数。

其次,有时你必须使用一个(例如,如果你有最终的类变量,它们必须在创建对象时初始化)。在这种情况下,您必须编写一个构造函数,并在实例化对象时使用它。

public class Foo {
    final int a;
    public Foo (int val){
        this.a = val
    }
}
Foo foo = new Foo (23);

你的思路是对的。Java采用的语法只是一个历史工件。

在支持 OOP 的较新语言中,通常不存在这种冗余。Scala称它为this*,F#称它为new*,Python称它为__init__,Ruby称它为initialize等等。


* 无论如何都是辅助构造函数。这些语言中的主要构造函数是类参数本身。

既然你不能显式调用构造函数,那么给它起一个特殊的名字的目的是什么? 关于与类名称相同的构造器:构造只能在函数中执行,因此构造函数是一个函数。 由于它是一个特殊的函数,在其他类函数中,它应该有一个特殊的签名。 语言设计者希望它们与类命名相同。