在接受采访时我被问到为什么在构造函数退出时会创建一个新对象?
我说当我们为任何类声明对象时,内存是在运行时在堆栈或堆中创建的。一旦创建了内存,就会调用构造函数,当它完成时,它会返回新对象,因为空间中充满了构造函数初始化的内容,因此也填充了新对象。
如果有人解释面试官要求的内容,我会非常感激。
答案 0 :(得分:2)
面试问题的正确答案是构造函数不会返回任何内容。 当初始化其类型的对象时,将调用类的构造函数。此时,构造对象的存储区域已经被保留并且地址已知。因此,除非出现错误情况,否则构造函数不需要返回任何内容,这可以通过异常进行报告。 构造函数的唯一工作是将有用的值写入该内存区域,并通常建立由复制和移动操作维护的类的不变量。 为了完成它的工作,构造函数将首先调用其父构造函数,而构造函数又将调用其父构造函数,直到继承层次结构的顶部。在多重继承的情况下,父构造函数按其声明的顺序调用。对于虚拟继承,将首先调用虚拟类的构造函数,以确保它在类层次结构中使用的任何位置都已正确初始化。 一旦父构造函数完成,类的成员按声明的顺序初始化,最后执行构造函数自己的主体。 破坏以相反的顺序进行,只有完全构建的破坏才被破坏。 一旦对象完成构造,就完全构造了一个对象。 因此,如果成员或父构造函数抛出,或者如果在构造函数体中抛出异常,那么到目前为止成功创建的所有成员和父代将按其构造的相反顺序正确销毁。 在使用new进行分配的情况下,将释放对象的内存并重新抛出异常。
正如您所看到的,构造函数只是初始化一个对象的内存,您已经知道如何访问它(通常是通过变量),因此它永远不会返回任何值。
添加示例:
class T : private parent {
U member_first;
V member_second;
};
T foobar() {
T a{};
return a;
}
这将使用默认构造函数显式构造类型为T的对象。 定义变量a的函数将在调用时在堆栈上保留sizeof(T)字节(假设机器具有堆栈;))。到目前为止,没有调用构造函数。 现在,当调用默认构造函数时,名为a的对象的this指针设置为& a的值,并执行默认定义的构造函数:
T::T() : parent{}, member_first{}, member_second{} {}
我希望这个例子清楚地表明,不是让构造函数返回一些内容,而是隐式地给出了必须初始化的内存区域的地址,类似于返回void的函数,它将指针作为参数并更改指向的值。
答案 1 :(得分:0)
返回新对象(对创建对象的引用)
简而言之,您可以创建表达式中使用的临时对象。
考虑一个例子
#include <iostream>
#include <string>
int main()
{
std::cout << std::string( "Hello ").append( "World!" ) << std::endl;
return 0;
}
构造函数调用是一个表达式,它的类型与void不同。