为什么构造函数不返回值?

Dr.*_*len 80 constructor

请告诉我为什么构造函数不返回任何值.我想要一个完美的技术理由向我的学生解释为什么构造函数没有任何返回类型.

Dat*_*han 104

构造函数实际发生的是运行时使用编译器生成的类型数据来确定在内存中存储对象实例需要多少空间,无论是在堆栈上还是在堆上.

此空间包括所有成员变量和vtbl.分配此空间后,构造函数将作为实例化和初始化过程的内部部分进行调用,以初始化字段的内容.

然后,当构造函数退出时,运行时返回新创建的实例.因此构造函数不返回值的原因是因为它不是由代码直接调用,而是由运行时中的内存分配和对象初始化代码调用.

它的返回值(如果在编译为机器代码时实际上有一个)对用户来说是不透明的 - 因此,您无法指定它.

  • 尽管这在技术上是详细和正确的,但简单的"它不是为了做到这一点"就足够了恕我直言.当然,设计运行时以返回构造函数的返回值而不是新创建的实例是不可能的.它只是没有多大意义,因此不是为了做到这一点.:) (5认同)
  • 我不太确定.Net - 以上是我对C++采用的方法的理解.我确信.Net是非常相似的,除了编译器生成的元数据不仅仅包含实例化它所需的空间量(而且c ++也存储了一些关于类型的元数据,但是支持的规模没有.净). (2认同)

Thi*_*ilo 12

好吧,在某种程度上它返回刚刚构造的实例.

你甚至可以这样称呼它,例如Java

 Object o = new Something();
Run Code Online (Sandbox Code Playgroud)

这看起来就像调用带有返回值的"常规"方法

 Object o = someMethod();
Run Code Online (Sandbox Code Playgroud)

  • 如果您知道唯一可能的结束状态是"您有一个Something实例"或"抛出异常",那么它可以更容易地使用构造函数.(我们用C尝试了整个"让调用者检查每个返回值"的事情.)每次调用者必须检查两个正交错误报告机制是否有好处,或者您是否建议废除异常? (5认同)
  • 那么为什么不允许该方法返回`null`?我不相信.一点也不. (2认同)