2

目前,我们正在撰写关于为学术面向对象的迷你编程语言实现编译器的学士论文。

我们希望在我们的文档中保持精确,并且我们目前正在讨论构造函数是否是例程。

我们认为构造函数一个例程是它有一个命令块、参数块和局部变量。尽管缺少名称,但给出了其他例程的所有其他属性。

我们认为构造函数不是例程的观点是每个实例只能调用一次。

我们不确定这个问题是否有明确的答案,或者定义是否因理论而异。

如果有人能指出一些关于这个语义问题的文献,我们会很高兴。

最好的

编辑:关于我们如何用我们的语言命名特定事物的一些信息:

  • 我们有功能和程序。函数确实有返回值,过程没有。
  • 构造函数就像一个未命名的过程(没有明确的返回值)
  • 构造函数被称为隐式,java如:x := new X(1, new Y())
  • 参数是在定义构造函数期间定义的。自己的实例 ( this) 不被视为参数,而是隐式提供

到目前为止,感谢您的回答,他们正在帮助您完成整个过程。

4

6 回答 6

2

构造函数是构造函数。

它可能像一个函数(返回值:新对象),过程(例程,没有返回值的函数,在未初始化的对象上调用),它可能在一个对象上可调用一次或多次(尽管它是有争议的,无论object 之后具有相同的身份..),它可能有名称或没有名称,或者名称可能被强制以匹配类等。构造函数甚至可能“不存在”或由编译器从各种分散的初始化程序隐式创建和代码块,否则将是表达式/例程/whatchamacallit。

这完全取决于您编译的语言以及“函数”、“例程”甚至“参数”是什么意思(即“this”是参数吗?)。

如果你想问这样的事情,首先描述/定义你的语言和你想使用的所有术语(什么是类?方法?函数?例程?参数?构造函数?...)然后,嗯,大多数可能您会自动推断出与您的本体匹配的答案。

于 2013-06-27T10:33:10.757 回答
2

构造函数是具有特殊语义的函数(例如在特定上下文中调用它 - 作为对象构造的一部分),但无论如何它是一个函数 - 它可以有参数,它有通常的控制流,它可以有局部变量,等等。它并不比任何其他功能更好或更差。我会说这是例行公事。

于 2013-06-27T10:40:27.260 回答
2

这取决于语言 - 对于这种学术语言 - 我不会说构造函数是例程。我之所以这么说是因为在不说它是例程的情况下,保持了分离:除非语言明确统一了例程/函数/构造函数,否则不要说它是 :)

现在,考虑这些反例(我敢肯定还有更多):

  • 像 Eiffel 这样的语言允许给构造函数起不同的名字(我认为这很棒,希望被更多地使用)。
  • 像 Ruby 这样的语言没有“new”运算符,调用构造函数就像调用任何(类)方法一样。Ruby 甚至没有办法表明方法充当构造函数(或工厂方法)。
  • JavaScript 等语言中的构造函数只是可以new.

此外,在某种程度上,可以认为多次调用构造函数(你得到一个新对象 - 那又怎样?)与多次调用一个函数(其中一个可能会得到相同的值)没有区别. 考虑到新对象可能是不可变的并且可能与其他对象具有相等的值。

也就是说,考虑到下面的代码,是否使用了构造函数?

5 4 vec2 "1" int 2 vec2 add puts

我编造了,但我希望它能说明问题。构造函数和普通函数之间可能存在也可能没有构造函数或外部差异,具体取决于特定语言如何看待构造函数的角色(甚至需要)。

现在,编写认为合适的语言规范,并尽量避免泄露实现细节

于 2013-06-27T10:37:39.543 回答
1

从外部看,构造函数可以看作是一个类方法,该类的一个实例作为返回值。到目前为止,“每个实例只能使用一次”的说法并不成立,因为使用构造函数时还没有实例。

从内部来看,一些特殊的关键字名称(如“this”)绑定到未初始化的实例。

通常,有一些语法糖,比如一个新的关键字。此外,编译器可能有助于确保正确初始化实例。

它的特殊之处在于没有其他地方提供创建新对象的功能。但就其用法而言,构造函数与任何其他碰巧返回该类实例的类方法没有(或至少不应该)不同。

顺便说一句,“例程”是 OOP 中的一个既定术语吗?

于 2013-06-27T10:50:24.460 回答
1

我认为 aRoutine是可以在构造对象/类的调用者需要时显式调用的,而 aconstructor可以称为特殊类型的例程,在请求类的实例时在运行时调用。

  • 构造函数仅有助于构造和初始化类对象及其变量。
  • 可能接受也可能不接受参数,它可以用不同的参数集重载
  • 如果构造函数没有参数并且其代码块中也没有代码,您可能需要省略它
  • 如果您不提供自己的构造函数,某些语言会自动创建默认的无参数构造函数(如 C#)
  • 构造函数可以有一个访问修饰符来限制类的创建范围
  • 构造函数不能有返回类型,因为它构造了与声明它的类相同的类,显然返回相同的类型是没有意义的(可能这就是某些语言使用与类名相同的构造函数名称的原因)
  • 构造函数的所有实现规则语言而异
  • 此外,编写良好的构造函数最重要的要求是,在它执行之后,它应该使类对象处于有效状态
于 2013-06-27T10:46:31.700 回答
-1

构造函数(如名称)仅在您创建该类的新实例时由编译器执行。

总体思路是这样的:您放置了一些应该在启动期间执行的操作,这就是在构造函数上执行的操作。所以这意味着,你不能像你的类的其他方法那样调用构造函数。

于 2013-06-27T10:25:59.950 回答