在C++;构造函数是在对象创建之前还是之后调用的? 我找到了关于java的一些问题的答案,但没有什么特别的C++。我在Java中读过,首先创建对象,然后调用构造函数。我想知道这是否是C++的相同过程?另外,如果是这样的话,那么拥有一个默认构造函数有什么意义呢?是为了继承吗
两者都不是。 对象创建过程包括构造函数调用在C++;构造函数是在对象创建之前还是之后调用的? 我找到了关于java的一些问题的答案,但没有什么特别的C++。我在Java中读过,首先创建对象,然后调用构造函数。我想知道这是否是C++的相同过程?另外,如果是这样的话,那么拥有一个默认构造函数有什么意义呢?是为了继承吗,c++,constructor,C++,Constructor,两者都不是。 对象创建过程包括构造函数调用 拥有默认构造函数的意义在于允许对象创建过程的这一部分是不可操作的。否则会是什么?以下是顺序:首先,分配内存。然后调用任何基类构造函数。最后调用类构造函数 如果总是使用参数列表创建对象,则实际上不需要默认构造函数。是的,首先分配对象的内存,然后调用构造函数来实际构造内容。有点像盖房子,你首先购买[或合法获得许可]建造它的土地(内存),然后开始建造。如果你反过来做,你很可能会遇到麻烦 当需要构造没有参数的对象时,将使用默认构造函数。在某些情况下,这没有任何
拥有默认构造函数的意义在于允许对象创建过程的这一部分是不可操作的。否则会是什么?以下是顺序:首先,分配内存。然后调用任何基类构造函数。最后调用类构造函数
如果总是使用参数列表创建对象,则实际上不需要默认构造函数。是的,首先分配对象的内存,然后调用构造函数来实际构造内容。有点像盖房子,你首先购买[或合法获得许可]建造它的土地(内存),然后开始建造。如果你反过来做,你很可能会遇到麻烦 当需要构造没有参数的对象时,将使用默认构造函数。在某些情况下,这没有任何意义,但是默认构造函数被使用,例如在
std::vector
中-因为std::vector
将被实现为一个对象数组,如果您[使用push_back
]来扩展它,那么大小将加倍(或类似于它的东西),向量后面未使用的对象将默认构造
所有的对象都需要在创建之后构造(即使你没有声明一个,在这种情况下你会得到一个空的构造函数,如果编译器很聪明,它不会调用构造函数,因为它什么都不做)术语“默认构造函数”只是指不需要参数的构造函数,以使其在默认情况下可以使用。例如:
struct MyObject {
MyObject() { ... } // default constructor
MyObject(int) { ... } // some other non-default constructor
};
int main()
{
MyObject x; // default constructor is called since you didn't give
// any explicit parameters.
MyObject x2(5); // A non-default constructor is called.
}
请注意,术语“default”并不意味着您没有定义它。默认构造函数可以由您提供,也可以在某些情况下自动生成。您甚至可以使用默认构造函数:
struct MyObject {
MyObject() = default; // defaulted default constructor
};
这里,您已经告诉编译器使用默认实现生成默认构造函数
不管它是否是默认构造函数,在执行构造函数体之前,对象已经尽可能地自动构造。这意味着已经分配内存来存储对象,已经构造了任何基类,并且已经构造了任何成员。该对象还采用了为RTTI和虚拟函数调用而构造的类的类型标识。您似乎混淆了一些术语,但我将尝试定义一些(非官方)术语来澄清这个问题:
这是为对象分配内存的步骤
这是“设置”语言相关对象属性的步骤。完成vTable和任何其他“语言实现”相关操作
现在分配并初始化了一个对象,构造函数正在执行。是否使用默认构造函数取决于对象的创建方式
可以考虑在第三步之后创建的对象。
另外,如果是这样,那么默认值有什么意义呢 到底是什么 “默认构造函数”的要点是告诉程序应该如何构建没有参数的对象,换句话说,对象的“默认”状态是什么 例如,std::unique_ptr
的默认状态是指向null,不带删除器。字符串的默认状态是大小为0的空字符串。
向量的默认状态是大小为0的空向量。
T
的默认状态是构造函数T()
指定的状态,因为资源分配问题,必须在创建对象后调用构造函数。对象不过是一个具有函数指针(函数成员)和成员变量(属性)的结构。如果构造函数在内存中分配这些值之前设置了这些值,则会发生错误
例如,构造函数在对象的成员变量中存储int值,但尚未分配对象的成员变量,因此无法成功存储该值
问候 这取决于你所说的“创造”是什么意思。显然,在创建对象之前应该先分配内存 但正式地说,在构造函数完成执行之前,不会创建对象(其生命周期不会启动)。若构造函数并没有完全执行(例如,发生了异常),那个么对象就被认为根本不存在。例如,将不会调用此对象的析构函数(与任何现有对象一样) 当您进入构造函数体时,您可以确保成员已创建(默认构造函数或构造函数初始值设定项列表中传递的任何内容;变量初始化的常用语言规则适用:标量变量的初始值未定义) 当你考虑继承时,它甚至更复杂。当您进入构造器主体时,祖先部分已经是现有的对象:它们的构造器已经完成,即使子级无法正确构造自身,也会调用它们的析构函数。对象创建在不同的语言中意味着不同的事情。但在C++中,最突出的问题是“对象生命周期何时开始”。当一个对象的生命周期开始时,这意味着当它以后结束时(删除它,或者如果它是堆栈对象,则