c++ - 在 C++ 中链接构造函数时,首先调用哪个构造函数?
问题描述
我正在处理一个大型程序,其中许多构造函数相互交互,我设法将问题定位为我对将它们链接在一起时构造函数的执行顺序缺乏了解。
当您执行以下操作时:
#include<iostream>
struct one
{
int x;
one(int x) {this->x = x; std::cout << x << std::endl;}
};
struct two
{
int x;
two(int x) {this->x = x; std::cout << x << std::endl;}
};
struct three
{
int x;
three(int x) {this->x = x; std::cout << x << std::endl;}
};
struct parent
{
one o1;
two o2;
three o3;
parent():o1(1), o2(2), o3(3){}
};
int main()
{
parent p;
}
您将获得以下输出:
1
2
3
但是,当您将父代码中的代码更改为:
struct parent
{
three o3;
two o2;
one o1;
parent():o1(1), o2(2), o3(3){}
};
你得到
3
2
1
这似乎表明调用构造函数的顺序是由成员变量/对象放置在结构中的顺序决定的,而不是构造函数调用放置在“链”中的顺序(这里的父构造函数案子)。
这对我来说不够直观,以至于我想知道这种行为是否有据可查并且是有意的,或者我是否只是在摆弄未定义的行为。换句话说,编写依赖于该属性的代码会是一种不好的做法吗?
提前致谢
解决方案
推荐阅读
- sql - TIBScript 和局部变量
- java - 将两个具有相同方法但名称空间不同的接口转换为一个泛型类/接口
- css - 使用可选参数制作 SCSS mixin 失败的原因是什么?
- azure - 存储 REST API 返回远程名称经常无法解析
- python - 当使用符号链接而不是副本时,pip3 如何知道它应该将包安装到虚拟环境中?
- python - xgboost 如何知道训练模型的参数
- google-maps - 抽屉中的谷歌地图颤动
- jsf-2 - Rich:Editor - com.sun.faces.application.view.StateHolderSaver 无法转换为 [Ljava.lang.Object;
- regex - SPARQL 查询中的递归正则表达式以识别匹配的括号
- python-3.x - dash应用程序中的重复回调输出错误