【问题标题】:Why can't we return anything from the constructor?为什么我们不能从构造函数返回任何东西?
【发布时间】:2011-08-11 01:29:54
【问题描述】:

C++ 说我们不能从构造函数返回任何东西?其背后的历史原因是什么? 为什么 Bjarne 不允许构造函数返回与任何其他成员函数不同的东西?

【问题讨论】:

  • 你会返回什么?
  • 您对从构造函数返回 something 的提议有什么理由?我会说这没有意义,这就是它不返回 something 的原因。
  • BlackBear 该类的对象。我知道这是隐含的,但为什么呢?
  • “我知道这是隐含的”。完毕。你已经回答了你自己的问题。很棒。
  • 你将如何收到返回值?构造函数不像函数那样被调用。

标签: c++ constructor history


【解决方案1】:

因为在new 语句或变量初始化程序中构造对象时,返回的对象是正在构造的新对象。你会如何处理从构造函数返回的对象?它永远无法在任何地方归还;返回的是正在构造的对象。在调用构造函数之前已经(部分)创建了该对象(否则,构造函数将没有要处理的对象),并且它必须是从构造函数返回的内容,因此使用户没有意义退回它或让他们通过尝试退回不同的东西来迷惑自己。

【讨论】:

  • 很公平。接受你的回答。
  • 还要考虑临时工 - std::string("hello, world")。这既不是一个新的语句也不是一个变量初始化器,所以你可能会简单地想象它可以返回一个不同的对象。但是,对象占用的内存仍然不是由构造函数提供的,除了为临时创建的堆栈空间之外,没有任何明智的方法可以使对象位于其他任何地方,最好不要考虑这就像“只是对构造函数的调用”。
【解决方案2】:

我认为构造函数返回自身,但不必有 return 语句。

如果它返回自己,那么它不能返回任何东西。

【讨论】:

    【解决方案3】:

    我不能代表 Bjarne,但是查看构造函数的惯用方式是它返回它构造的对象。

    【讨论】:

    • :) 因此术语 - C O N S T R U C T O R
    【解决方案4】:

    除了让构造函数返回一些东西会让构造函数做两件事而不是一件(这通常是不受欢迎的事情)之外,请注意构造函数不能命名,因此不可能显式调用它们。

    由于不可能构造一个显式调用构造函数的表达式,因此在任何情况下都无法分配或引用构造函数的返回值。

    试图从构造函数返回一些东西根本不符合语言设计。

    构造函数不会“返回”对象,它们会在调用它们的内存区域中初始化对象。如果您声明具有静态存储持续时间的类类型的对象(并且该类型具有用户声明的构造函数),则为程序的生命周期保留内存,并且实现确保调用构造函数以在该位置初始化对象在程序中的适当时间。

    同样,如果你声明和对象具有自动存储持续时间,实现会保留空间(非正式地一些堆栈空间)并在每次执行声明语句时调用构造函数。

    在new表达式的情况下,内存是动态分配的,实现调用适当的构造函数来初始化对象。

    请注意,如果X 是一个类类型,那么所有这些语句中的X 总是引用类型的名称,而不是实际上没有名称的构造函数。声明或定义构造函数的语法是特殊的,并不意味着构造函数有名字。假设X 有一个用户声明的构造函数。

    X x; // Initialize an object of type X using the default constructor
    
    X(); // Value initialize a temporary of type X. Not an explicit constructor call.
    
    new X(); // new expression: value-initialize a dynamically allocated X
    
    X(a); // A function style cast
    
    X(a, b); // Construct an X from the expression list. X must have a
             // suitable constructor but the X still refers to the type.
    

    【讨论】:

      【解决方案5】:

      构造函数只能产生对象本身...

      【讨论】:

        【解决方案6】:

        构造函数没有 retunrn 类型,因为它已经将 refrence_id 返回到 refrence 变量(称为对象),例如:- Emp e1 = new Emp(refrence_id) 这里 Emp 是 class_name e1 是参考变量 new 用于动态分配 Emp() 是类 Emp 的构造函数 在此构造函数中,将 refrence_id 返回到 refrence 变量 e1

        【讨论】:

          猜你喜欢
          • 2020-11-27
          • 2023-02-07
          • 2022-01-15
          • 1970-01-01
          • 2020-07-24
          • 1970-01-01
          • 1970-01-01
          • 2016-11-10
          • 1970-01-01
          相关资源
          最近更新 更多