构造函数初始化列表。初始化顺序

8

可能重复:
构造函数初始化列表的评估顺序

在编写C++类的构造函数时,为什么初始化成员字段的顺序应该是它们声明的顺序?

考虑以下C++代码。使用gcc编译(gcc -g -Wall foo.cpp)会得到警告。

g++ -g -Wall main.cpp 
main.cpp: In constructor ‘myclass::myclass(int, int, int, int, int, int)’:
main.cpp:12: warning: ‘myclass::z’ will be initialized after
main.cpp:11: warning:   ‘int myclass::y’
main.cpp:26: warning:   when initialized here

以下是代码。在这个代码中,成员z在构造函数类的初始化列表中出现在y之前,导致上述警告。

#include <iostream>
#include <iomanip>

class myclass
{
public:
  int x;
  int y;
  int z;
  myclass(int num1, int num2, int num3, int num4, int num5, int num6);//constructor for the class

private:
  int a;
  int b;
  int c;
};

myclass::myclass(int num1, int num2, int num3, int num4, int num5, int num6) 
  :x(num1),z(num3),  y(num2), a(num4),b(num5),c(num6)
{}

int main(int argc, char *argv[])
{
  myclass jimmy(23,34,56,67,89,91);

  std::cout << jimmy.x << std::endl;
  std::cout << jimmy.y << std::endl;
  std::cout << jimmy.z << std::endl;

  return 0;
}

1
100%重复,让我找找...回答这个问题,因为编译器总是按照类内定义的顺序初始化它们,无论你如何编写mem-initializer。 - Xeo
1
这个警告可能是为了提醒你,列表并不是设置顺序的地方,以防你希望通过改变初始化顺序来实现关键的操作。 - tmpearce
1个回答

9
这可能有所帮助, 构造函数初始化列表的求值顺序 请参见上述AProgrammer的回复, “它们按成员声明顺序而不是构造函数顺序进行构造的原因是,一个类可能有多个构造函数,但只有一个析构函数。并且析构函数以与构造相反的顺序销毁成员。” - AProgrammer Aug 7 '09 at 6:45

你比我先发了,而且还提供了更好的参考 :) - Joachim Isaksson
我看到你是SO(StackOverflow)的新手,所以欢迎并祝贺你第一次参与。然而,你应该知道你给出的答案并不适合这个网站:有一个机制可以链接重复的问题,因此没有必要链接和复制另一个答案的内容。如果你想给出一个类似的问题链接,你应该在问题的评论中这样做(当你有足够的声望时,你就能很快评论)。稍后,你会发现你可以将一个问题标记为重复(就像现在这个问题一样)。 - Luc Touraille
Luc,感谢你的欢迎和指引,非常感激。我会确保查找重复项并在未来使用你提到的机制。再次感谢。 - ehuffman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接