【问题标题】:Is it good practice to initialize a member variable of a class in the header file? [closed]在头文件中初始化类的成员变量是一种好习惯吗? [关闭]
【发布时间】:2021-06-19 20:09:35
【问题描述】:

假设我有一个指针,我希望它被初始化为 nullptr。哪个选项会更好,创建一个将该成员变量设置为 nullptr 的构造函数,或者只是在头文件的声明中将其初始化为 nullptr。

有什么不同吗?后者被认为是不好的做法吗?

提前致谢。

【问题讨论】:

  • 默认初始化器被应用到每个构造函数,所以如果你向类添加一个新的构造函数,你不需要检查每个成员。您还可以更改覆盖该值的构造函数中的默认初始化。我总是使用默认初始化而不是构造函数初始化,首先是因为您可以确定每个构造函数都会发生这种情况,其次(IMO)它的可读性更好
  • 我认为唯一可能的不好的做法是首先使用指针。如果用例确实需要一个指针,那么使用像std::unique_ptr 这样的 smart 指针,其默认构造函数会将其初始化为“null”。

标签: c++


【解决方案1】:

在类体中初始化一个成员完全等同于在构造函数的成员初始化器列表中进行。 (但如果你在这两个地方都提供了初始化器,member-init-list 会覆盖类主体中的初始化器。)

尽可能在类主体中进行初始化是一种很好的做法,因为它不易出错(如果您忘记初始化新添加的成员,您会立即注意到;请参阅DRY)。

【讨论】:

  • 如果后者能够覆盖前者,为什么它完全等效?如果它们是等效的,我希望使用两种方式分配不同的值会 UB 或其他东西。
  • @Enlico 我认为他的意思是如果你做一个或另一个结果是一样的。他没有说要同时做这两件事
  • @Enlico RoQuOTriX 说了什么,但我进行了编辑以使其更清晰。
  • 不存在完全等价的顺便说一句:在类主体中,你不必有构造函数,因此类可能是聚合的,你可能没有用户提供的构造函数,等等。跨度>
【解决方案2】:

如果我正确理解你的问题,这个链接应该会给你一些信息:CPPCoreGuidelines

C.45:不要定义只初始化数据成员的默认构造函数;改用类内成员初始化器

原因

使用类内成员初始化器可以让编译器为您生成函数。编译器生成的函数可以更高效。

例子,不好

class X1 { // BAD: doesn't use member initializers

    string s;
    int i;
public:
    X1() :s{"default"}, i{1} { }
    // ...
};

示例

class X2 {
    string s = "default";
    int i = 1;
public:
    // use compiler-generated default constructor
    // ...
};

执法

(简单)默认构造函数应该做的不仅仅是用常量初始化成员变量。

【讨论】:

  • 请不要发布仅链接的答案,至少引用您所指的部分。
  • 好的,对不起,我认为没有必要,因为链接直接指向该部分,我将编辑我的消息
  • 不用担心 :) 有时链接的页面会四处移动,如果几年后有人会偶然发现您的答案却发现一个死链接,这将是令人沮丧的。所以最好至少在这里包含一些信息。但也要保留链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
相关资源
最近更新 更多