给构造函数命名有什么意义
What is the sense in giving names to constructors
我已经使用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
等等。
* 无论如何都是辅助构造函数。这些语言中的主要构造函数是类参数本身。
既然你不能显式调用构造函数,那么给它起一个特殊的名字的目的是什么? 关于与类名称相同的构造器:构造只能在函数中执行,因此构造函数是一个函数。 由于它是一个特殊的函数,在其他类函数中,它应该有一个特殊的签名。 语言设计者希望它们与类命名相同。
- 是什么让放置新调用对象的构造函数?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 构造函数后面的宏.什么意思?
- C++构造函数内部会发生什么?
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 我是否为邪恶刽子手的构造函数错过了什么?
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 什么时候用指针调用C++类构造函数
- 这个构造函数是做什么的
- 将复制构造函数设置为private和=delete有什么区别
- 我不明白在这个例子中什么时候调用构造函数
- 在C++中,从构造函数中将字符串文本分配给成员const char*变量时会发生什么
- c++ 17 中结构自动定义构造函数的规则是什么?
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 指示汇编时间叫什么构造函数
- 在这种情况下调用什么构造函数
- 使用什么构造函数