C++:构造和初始化顺序保证

2023-12-10

我对 C++ 中的构造和初始化顺序保证有一些疑问。例如,下面的代码有四个类X, Y, Z and W。 main函数实例化一个对象class X,其中包含一个对象class Y,并且源自class Z,因此两个构造函数都会被调用。此外,const char*参数传递给X的构造函数将隐式转换为对象class W, so W的构造函数也必须被调用。

C++ 标准对复制构造函数的调用顺序有何保证?或者,同等地,该程序可以打印什么?

#include <iostream>

class Z {
   public:
   Z() { std::cout << "Z" << std::endl; }
};

class Y {
   public:
   Y() { std::cout << "Y" << std::endl; }
};

class W {
   public:
   W(const char*) { std::cout << "W" << std::endl; }
};

class X : public Z {
   public:
   X(const W&) { std::cout << "X" << std::endl; }
   private:
   Y y;
};

int main(int, char*[]) {
   X x("x");
   return 0;
}

编辑:这是正确的吗?

   W      |
 /   \    |
Z     Y   |
 \   /    |
   X      V

在所有类中,构造顺序都是有保证的:基类,从左到右指定,后面是按照类定义中声明的顺序的成员变量。一旦类的所有基类和成员的构造完成,类的构造函数主体就会被执行。

在你的例子中X源自Z并包含Y so the Z首先构造基础对象,然后构造Y member y,然后构建X执行完成X的构造函数主体。

临时的W需要传递给构造函数X,因此它是在构建之前构建的x开始并在初始化后被销毁x完成。

所以程序必须打印:

W
Z
Y
X
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:构造和初始化顺序保证 的相关文章

随机推荐

  • 如何从 PHP 中的 URL 字符串中提取查询参数?

    用户可以在我的网站上使用 HTML 表单输入 URL 因此他们可能会输入如下内容 它可以是任何东西 我需要提取某个查询参数的值 在本例中为 test 值 123 有没有办法做到这一点 您可以使用parse url and parse str
  • 检测客户端是平板电脑还是手机的最佳方法是什么?

    我目前正在开发一个客户端应用程序 该应用程序将为智能手机和平板电脑设计 因此它将得到两种不同的布局模式 虽然用户可以在两种模式之间切换 但我必须在第一次使用该应用程序时预先设置模式 因此 我正在寻找一种可靠的方法来自动检测用户是否带有平板电
  • 如何打印未读答案中的邮件正文和主题?

    我想获取收件箱中未读邮件的邮件主题和正文 我想一次阅读一封未读邮件并将其标记为read然后 我需要subject 发件人地址 and 邮件正文 下面的代码显示了所有未读邮件的邮件 ID require once mail3 php ews
  • Javascript 函数不等待 AJAX 响应

    我有一个名为的 AJAX 函数flagIt 它是从另一个名为的函数中调用的validateForm validateForm 在提交时执行 function validateForm var error do stuff to valida
  • 如何避免 spring-boot-admin 中的证书验证?

    如何避免 spring boot admin 中的证书验证 链接错误图片 https ibb co fkZu8y 我配置 RestTemplate 以避免在类中使用证书 但我不知道如何发送它 我猜它必须在客户端中 spring boot a
  • python 刷新/重新加载

    这是一个非常基本的问题 但我无法通过在线搜索找到答案 我正在使用 python 来控制 ArcGIS 并且我有一个简单的 python 脚本 它调用一些预先编写的代码 但是 当我对预先编写的代码进行更改时 它似乎不会导致任何更改 我导入这个
  • 通过 USB 将文件从 PC 传输到 Android 设备

    我想以编程方式通过 USB 将文件从我的电脑的特定端口传输到 Android 设备 以下哪种技术最适合这种传输模式 Sockets HttpUrlConnection 如果可以通过HttpUrlConnection意思是如何实现这个 通过
  • JavaFX自动滚动自动更新文本

    关于 JavaFX 的新手问题 我无法回答 尽管我知道它一定非常简单 而且在我看过的任何地方都没有找到任何资源 教程 许多 Oracle 在线文档 文章 以及知名JavaFX博主等 我正在开发一个命令行 脚本 运行的应用程序 并且我已经成功
  • constexpr 静态数据成员给出未定义的引用错误

    我正在开发内核 我想创建我的静态数据成员constexpr所以我可以在一个enum class 但是 如果我这样做 我会收到未定义的参考错误 只有当我将其设置为非 constexpr 并在类之外对其进行初始化时 它似乎才起作用 Workin
  • 如何使用其他 webcontroller odoo 9.0 更改 odoo 的默认页面

    我创建了一个具有特定功能的新 Web 控制器 我希望将此 Web 控制器作为odoo 9 0 我试过把 http route type http auth public website True in main py我的自定义 webcon
  • 链接 LLVM 导致 gcov 失败

    Passing coverage到 gcc 同时链接 LLVM 会导致undefined reference to gcov exit 来自链接器的错误 我已经建立了一个新项目来尝试解决这个问题 你可以查看github上的源码 and 检查
  • Vue.Js - Firebase 函数不能在组件上使用

    我正在使用 Vue Resource 将数据从我的网络应用程序发布到 firebase 但是后来 我发现我需要使用 firebase 集成来上传 firebase 存储中的图像 所以我将它集成到我的 src main js 中 import
  • 在 Sublime Text 2 中显示所有可能的 CSS 值的包?

    通过基本的 Sublime Text 2 构建 我获得了 CSS 值自动完成功能only当我输入值的第一个字母时 如下图所示 不过 我一直在观看 Tuts HTML CSS 网络教程 这是一个示例视频 他的 Sublime Text 构建显
  • 将 MongoDB 查询转换为 Spring MongoDB 语法

    您好 我无法将以下 mongoDB 查询转换为 spring 查询 我尝试了多种方法 但没有得到结果 db getCollection FarmerCropDataLog aggregate match cropData crop RICE
  • JSDoc 中对象中任意键的值的文档结构

    我有一个函数factory function factory events for const key in events const before after events key 论点在哪里events通常是 only before a
  • 从 Java 将多个 PDF 作为单个打印作业打印(物理打印)

    我想在一个打印作业中从java 使用java打印服务 打印多个pdf 我想将多个 pdf 文件作为单个作业发送到打印机 这样 我的 批量 中的所有文档都会一起打印 并且当我从打印机中取出它们时 不会与其他人的打印作业交错 一个批次可能包含数
  • 如何使用 JavaFX TableView 显示基于列的数据集

    我正在尝试从 Swing 切换到 JavaFX 但 TableView 出现问题 我在内存中有一个基于列的通用数据结构 例如List
  • Apple 在 AppStore 中接受的最低 iOS 目标版本?

    我有一个应用程序 我希望在所有 iOS 版本上运行 但我认为 Apple 只接受某个版本及更高版本的应用程序 我认为是 3 0 但不确定 所以我的问题是 您可以发送审核 并获得接受 的最低 iOS 目标版本是多少 如果任何具有丰富 iOS
  • codeigniter 无法在实时页面上工作,在服务器上找不到错误

    我的 codeigniter 在本地主机上完美工作 但在 live 上无法工作 我的 codeigniter 是最新版本 我也尝试较旧的版本 它总是显示在重定向上找不到的页面 routes php 设置是 route default con
  • C++:构造和初始化顺序保证

    我对 C 中的构造和初始化顺序保证有一些疑问 例如 下面的代码有四个类X Y Z and W main函数实例化一个对象class X 其中包含一个对象class Y 并且源自class Z 因此两个构造函数都会被调用 此外 const c