我写了一个简单的类Actor,里面有int型和很多bool型成员:
下面是actor.cpp文件的摘录
Actor::Actor ()
:X(0),Y(0),W(14),H(14),speedX(0),speedY(0)
,left(false),right(false),up(false),North(false),
East(false),South(false),West(false),NorthEast(false),
NorthWest(false),SouthEast(false),SouthWest(false){}
…
这是来自actor。h头文件
class Actor
{
private:
int X;
int Y;
unsigned short int W;
unsigned short int H;
unsigned short int speedX;
unsigned short int speedY;
bool left;
bool right;
bool up;
bool North;
bool East;
bool South;
bool West;
bool NorthEast;
bool NorthWest;
bool SouthEast;
bool SouthWest;
public:
Actor();
~Actor();
这个编译没有任何错误,
但是如果我运行这个程序,我在开始的时候就会得到一个奇怪的段错误。
现在,如果我将初始化列表中的所有bool放入注释(//,left(false))中,并让gcc编译所有内容,程序将完美运行!
怎么了?我认为最好通过初始化列表初始化所有类成员。
这可能是g++的bug吗?
我已经尝试过使用left()而不是left(false)。不:我没有在任何地方使用new-或*-操作符!
首先,"我在一开始就得到了一个奇怪的段错误"甚至不接近错误描述。所以请贴出准确的错误。也因为你说"在gcc中发现了一个bug",gcc目前是4.8版本。所以,除非你告诉你正在使用哪个编译器和哪个版本的编译器,否则调试是无用的。
第二,初始化列表是有用的,当你有继承,并希望在基类部分和/或一些成员初始化一些特殊的行为。如果类中的对象具有重构造函数和相应的重复制构造函数和operator=,那么它也很有用,在这种情况下,您可以在初始化列表中调用所需的构造函数,从而节省在构造函数代码中进行复制的时间,因为否则,首先对象将被创建,然后您将不得不进行一些初始化。
第三,对于POD类型,除非您有一些奇怪的继承问题,否则在构造函数代码中执行赋值应该是好的。
最后,http://pastebin.com/x5tuvBFw是代码,带有文件名,它在gcc4.7(我猜甚至更早的版本)上编译和运行良好