2011-11-08 163 views
1

如果一个类有一个本身就是一个类的实例成员,那么构造函数总是必须在构造函数初始化列表中为它提供初始化?类实例成员初始化

在我的代码中的某些情况下,这会导致非常长的初始化列表,这是做事情的方式吗?我只问,因为它看起来不够优雅,但如果它是如何完成的话,那很好。

对于常量实例成员变量也是如此吗?

+0

在你以前的问题上看你的代码,我认为你需要改变你的口味。您不应该在构造函数的主体中使用长整数初始化列表,而是使用长整数列表。好的,所以'x(y)',当你习惯了'x = y;'时,有一点点后天的味道,但是就像你说的那样。 –

回答

1

对于对象,您将必须初始化没有默认构造函数的所有成员。 如果您省略初始化列表中的成员,将使用其默认构造函数(或者对于基元类型,其值将不确定)。

对于基本类型intpointers),它是合法的不是初始化它们,但它们的价值将是不确定

最后,您必须将引用初始化为其他对象(std::string&)。

查看this answer了解更多。

此外,我想指出,如果你的班级有很多成员,这可能是一个迹象,你应该把它分成几个小班。最好的做法是让只有一个职责的班级(见single responsibility principle)。

+0

恒常原始类型呢? – SirYakalot

+0

编译器出现错误: 错误:未初始化成员'A :: num'与'const'类型'const int' – Antoine

+0

所以......你总是需要在初始化列表中初始化常量吗?这是唯一的方法? – SirYakalot

2

如果你有一个默认的构造函数(不带参数) - 那么你不需要明确地初始化它。

对于常量实例,默认初始化没有意义,是吗?所以根本没有意义,除非你有东西要初始化它们。 (但是,如果出于任何原因,这当然是可能的,那就是你正在做的)。

+0

如果我在这样的头文件中放置一个常量:const int BLAH = 1;我得到一个错误,所以我认为我必须将它们放入初始化列表中,事实上它确实使编译器无声。这是错的吗? – SirYakalot

+0

并且你是否在说那些类类型的实例成员始终必须在初始化列表中,除非他们有一个默认构造函数? – SirYakalot

+0

@SirYakalot - 对于您的第一个问题,我不确定如果没有真正看到代码,我可以回答。对于你的第二个问题 - 除非你有参数的默认值,否则你会得到'error:没有匹配你的编译器调用'classname :: classname()'的函数。注意 - 这是**你自己的课程**。内置的类型和大多数STL类都有默认的构造函数。 – littleadv