c++ - 初始化列表似乎取决于类中变量的顺序
问题描述
我是 C++ 新手,这是我在这里的第一篇文章。我正在尝试了解初始化程序列表。问题是我越来越糊涂了。我做了一个简单的程序,没有用,但我收到一个我不明白的警告。
#include <iostream>
using namespace std;
class Base{
private:
string monkey2 = "";
string monkey1 = "";
public:
Base(string) : monkey2{monkey1}{
cout << "monkey1 " << monkey1 << endl;
cout << "monkey2 " << monkey2 << endl;
}
};
int main()
{
return 0;
}
我得到的警告是:
field 'monkey' is uninitialized when used here
和指向正下方行的箭头public:
。
奇怪的是,如果我改变字符串的顺序:
private:
string monkey2 = "";
string monkey1 = "";
public:
至:
private:
string monkey1 = "";
string monkey2 = "";
public:
警告消失了,我不明白为什么。我可以使用 g++ 编译它,但是当我的编辑器 vim 与 YCM 和 Clang 7.0.0 一起使用时,我会收到警告。我试图在 g++ 中尽可能多地激活警告,但我无法得到相同的警告。是我的代码还是。还是Clang?
解决方案
数据成员按照声明的顺序进行初始化。因此,当你有
class Base {
public:
Base();
private:
string monkey2 = "";
string monkey1 = "";
};
无论ctor做什么,变量monkey2
都将在之前 初始化。当数据成员的初始化相互依赖时,这可能会导致难以发现的问题。这里,monkey1
Base::Base()
Base() : monkey2{monkey1} { /* ... */ }
monkey2
由 初始化monkey1
,但由于声明的顺序,monkey1
此时未初始化,因为monkey2
首先初始化。这就是您收到警告的原因,这也是为什么通过monkey1
首先声明来减轻警告的原因 - 然后,通过类内初始化程序monkey1
设置为,并使用已经初始化的.""
monkey2
monkey1
以下(诚然是主观的)准则适用于这种情况:
推荐阅读
- python-3.x - 获取括号或双引号 pandas 字符串中的值
- excel - Excel 的 Print-To-PDF 以不正确的缩放比例显示 OfficeJS 内容
- php - 解析具有变形关系的资源类
- protractor - 在量角器中使用页面对象中的函数
- python - 多类意味着ROC计算
- c# - 单元测试和断言结果
- java - Java ClientProtocolException 异常优先级
- reactjs - 如何在 React C3js 中对 X 轴点进行分组?
- python - 来自 pandas 数据框的 plotly 折线图
- winapi - 如何一次将超过 4GB 的数据加载到内存缓冲区中?