Questions tagged «class-members»

10
我应该在成员数据中使用指针还是引用?
这是一个简化的示例来说明问题: class A {}; class B { B(A& a) : a(a) {} A& a; }; class C { C() : b(a) {} A a; B b; }; 所以B负责更新C.我的一部分跑通过棉绒的代码并将其whinged关于参考构件:棉绒#1725。这是关于照顾默认拷贝和分配的,这很公平,但是默认拷贝和分配对于指针也很不利,因此那里没有什么好处。 我总是尝试使用引用,因为裸露的指针不确定地介绍了谁负责删除该指针。我更喜欢按值嵌入对象,但是如果需要指针,可以在拥有指针的类的成员数据中使用auto_ptr,并将对象作为引用传递给周围。 当指针可以为null或可以更改时,我通常只在成员数据中使用指针。还有其他理由更喜欢指针而不是数据成员的引用吗? 难道说包含引用的对象是不可分配的,因为引用一旦初始化就不应更改?

3
C ++ 11允许非静态和非const成员的类内初始化。发生了什么变化?
在C ++ 11之前,我们只能对整数或枚举类型的静态const成员执行类内初始化。Stroustrup在他的C ++ FAQ中对此进行了讨论,并给出了以下示例: class Y { const int c3 = 7; // error: not static static int c4 = 7; // error: not const static const float c5 = 7; // error: not integral }; 并进行以下推理: 那么为什么存在这些不便的限制呢?通常在头文件中声明类,并且通常将头文件包含在许多翻译单元中。但是,为避免复杂的链接器规则,C ++要求每个对象都有唯一的定义。如果C ++允许在类中定义需要作为对象存储在内存中的实体,则该规则将被打破。 但是,C ++ 11放宽了这些限制,允许对非静态成员进行类内初始化(第12.6.2 / 8节): 在非委托构造函数中,如果给定的非静态数据成员或基类未由mem-initializer-id指定(包括由于构造函数没有ctor-initializer而没有mem-initializer-list的情况)并且该实体不是抽象类(10.4)的虚拟基类,则 如果实体是具有brace-or-equal-initializer的非静态数据成员,则按照8.5中的指定进行初始化; 否则,如果实体是变量成员(9.5),则不执行初始化。 否则,该实体为默认初始化(8.5)。 …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.