Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么类成员总是按照声明的顺序初始化? C++标准声明:_C++_Initialization - Fatal编程技术网

为什么类成员总是按照声明的顺序初始化? C++标准声明:

为什么类成员总是按照声明的顺序初始化? C++标准声明:,c++,initialization,C++,Initialization,非静态数据成员应按照其被初始化的顺序进行初始化 在类定义中声明(同样不考虑 mem初始值设定项) 为什么??如果成员按照它们在初始值设定项中出现的顺序进行初始化,如果它们没有在初始值设定项中列出,则默认为声明顺序,这不是更直观吗 重新编辑:复制 另一个问题中被接受的答案似乎并不完整(我很高兴被证明是错的,但我需要比答案中更多的解释) 它指出初始化总是按声明顺序进行的原因是,虽然可能有多个构造函数,但只能有一个析构函数,它需要使用声明来确定销毁顺序 我明白了为什么编译器需要使用声明顺序进行销毁,但

非静态数据成员应按照其被初始化的顺序进行初始化 在类定义中声明(同样不考虑 mem初始值设定项)

为什么??如果成员按照它们在初始值设定项中出现的顺序进行初始化,如果它们没有在初始值设定项中列出,则默认为声明顺序,这不是更直观吗

重新编辑:复制

另一个问题中被接受的答案似乎并不完整(我很高兴被证明是错的,但我需要比答案中更多的解释)

它指出初始化总是按声明顺序进行的原因是,虽然可能有多个构造函数,但只能有一个析构函数,它需要使用声明来确定销毁顺序


我明白了为什么编译器需要使用声明顺序进行销毁,但我不明白为什么它需要在构造时严格执行相同的顺序。如果它们确实需要对称,为什么允许程序员任意定义初始值设定项的顺序。似乎如果成员必须按特定顺序进行初始化,那么以不同顺序编写初始化器应该是编译器错误。

这里有很好的解释

这种排序的原因是因为只有一个析构函数,它必须选择一个“反向顺序”来销毁类成员。在本例中,最简单的解决方案是使用类内的声明顺序,以确保属性总是以正确的相反顺序销毁


当我编写一个类定义时,我认为它是类的蓝图。当我编写构造函数时,我并不认为它是一个蓝图。这也可能是他们的逻辑。虽然这是一个完全合理的问题,但这是一个骗局,见@Borgeader的评论,投票关闭了它。感谢链接,但它没有回答我的问题。我明白了为什么编译器需要使用声明顺序进行销毁,我不明白为什么它需要在构造时严格执行相同的顺序。如果它们确实需要对称,为什么允许程序员任意定义初始值设定项的顺序。似乎如果成员必须按特定顺序初始化,则以不同顺序编写初始化器应该是编译器错误。