所以我最近开始学习面向对象理论的基础知识,并且已经通过java实践了这一点。我的问题很简单,'为什么类名和构造函数名称必须相同'?
现在我已经阅读了这个问题 - >
Why Constructor will always have same name as of class and how they are invoked
尽管这种反应有意义,但降低了对关键字的使用,在我看来能够更有意义地能够以不同的方式命名构造函数并独立于类。现在,如果我没记错的话(稍微通过快速的Google验证),语法就像这样:
className objectName = New constructorName(variables)
所以我的观点是你已经将你想要创建对象的类命名为,为构造函数再次调用相同的名称有什么意义?你不妨写一下
className objectName = New (vars);
看到两者给出完全相同的信息。
在我看来,能够独立命名你的构造函数以便更好地了解它究竟是做什么的,将会更具语义性,例如:
thisClass thisObject = New thisConstructorMakesThis(vars)
除了上面链接中给出的响应之外,是否还有一些文档可以解释为什么构造函数和类的名称相同?
另外我注意到响应甚至没有明确提到动态命名的构造函数的考虑,而是“显式语法”,这听起来更像是一个绝对的构造函数名称
答案 0 :(得分:6)
当您编写new Identifier
时,Identifier
不是构造函数的名称,而是类的名称。它通常与变量的类相同,但并非总是如此。
变量的静态类型不需要与实例化的类匹配。例如:
Collection<Integer> numbers = new ArrayList<Integer>();
如果你没有写出类名,那就写了:
className objectName = new(vars);
在变量初始化的上下文之外会发生什么?如果您进行了内联new
调用,例如:
linkedList.next = new Node(value, null);
此处Node
并非多余;这是班上唯一提到的。如果你省略Node
,编译器将如何知道要实例化的类?
答案 1 :(得分:4)
至少在C ++中,构造函数没有名称。声明它们需要某种语法,并且决定使用函数声明语法和类名来代替函数名。没有特别的理由为什么选择它而不是其他名称或一些完全不同的语法。
在任何其他上下文中,类名是指类,而不是构造函数。
Java和C#都从C ++中获取了大部分语法,因此它们使用相同的约定。其他语言使用其他约定,例如Python中的__init__
。
你也可以写'className objectName = New(vars)',看两者给出完全相同的信息。
除了变量并不总是对您正在创建的同一个类的引用;它通常是对基类的引用:
base * thing = new derived;
所以new-expression 需要指定你想要创建的类型,与你想要引用它的类型分开。
此外,这些天你经常可以避免重复课程名称:
auto p = std::make_shared<thing>(vars);
当然C ++不强制对你进行动态分配:
thing t(vars);
在我看来,能够独立命名你的构造函数以更好地了解它究竟是做什么会更加语义
如果您需要比声明或new-expression语法允许更多的表达性,您总是可以编写一个命名的“工厂”函数(例如make_shared
)来创建和返回一个对象。
答案 2 :(得分:0)
您可以使用不同命名的构造函数(尽管在私有作用域后面仍然隐藏了默认构造函数。)
看看单身人士......
MySingleton singleton = MySingleton.getInstance();
答案 3 :(得分:0)
构造函数是一个构造类(创建对象)的特殊函数,因此具有相同名称是完全合乎逻辑的。这就是C#定义的方式和其他语言。构造者是特殊的东西。它们不能被调用,它们可以被实例化。