c++ - 在 C++ 中,构造函数是在对象创建之前还是之后调用的?

标签 c++ constructor

我找到了这个问题的一些关于 java 的答案,但没有找到具体关于 c++ 的答案。所以我在 Java 中读到首先创建对象然后调用构造函数。我想知道这是否与 C++ 的过程相同?另外,如果是这种情况,那么拥有默认构造函数有什么意义呢?是为了继承吗?

最佳答案

“对象创建”在不同的语言中有不同的含义。但在 C++ 中,最突出的问题是“对象生命周期何时开始”。当一个对象的生命周期开始时,这意味着当它稍后结束时(您删除它,或者如果它是一个堆栈对象,那么当它超出范围时),将调用析构函数。

如果对象的生命周期没有正式开始,那么如果它之后超出范围,则不会调用析构函数。

C++ 按如下方式解决此问题:

  • 当你创建一个对象时,比如类类型,通过调用构造函数,首先分配内存,然后运行构造函数。
  • 当构造函数运行完成时,生命周期就开始了,结束时会调用析构函数。析构函数完成后,内存将被释放。
  • 如果构造函数中止,比如抛出异常,则不会调用该对象的析构函数。但是,内存仍将被释放。

有关对象生命周期的更多信息,您可能需要查看例如this question ,或者更好,在标准/一本好的教科书中。

基本思想是,在 C++ 中,我们试图最小化内存分配和初始化之间的时间窗口——或者更确切地说,语言本身提倡“资源获取就是初始化”的思想并且在不给它一个类型并初始化它的情况下获取内存是不习惯的。通常编写代码时,例如如果你有一个类型为 A 的变量,你可以将其视为“这是指 A 的内存块,其中 A< 的构造函数 成功运行完成。”您通常不必考虑“这是一个大小为 A 的内存块,但构造函数失败,现在它是一个未初始化/部分初始化的 headless blob”的可能性。

关于c++ - 在 C++ 中,构造函数是在对象创建之前还是之后调用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34400042/

相关文章:

scala - 在 Scala 构造函数中捕获异常

c# - 如何从 C# 调用带有 std::vector 作为参数的非托管 C++ 函数?

c++ - 为什么将我的程序与 iso_c_binding 链接会导致对 __gfortran_ 的 undefined reference ?

java - 将基类对象转换为扩展基类的类时出现 ClassCastException

java - 如何在类的其他方法中使用在构造函数中初始化的对象

c++ - 在 "for"循环中使用的复制构造函数,但是在哪里?

C++ 显式构造函数和迭代器

c++ - 如何从 C++ 中的另一个类迭代获取数据?

c++ - GNU LD 符号版本控制和 C++ 二进制向后兼容性

用于灰度到 ARGB 转换的 C++ SSE2 或 AVX2 内在函数