Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在头文件中初始化类的成员变量是一种好的做法吗?_C++ - Fatal编程技术网

C++ 在头文件中初始化类的成员变量是一种好的做法吗?

C++ 在头文件中初始化类的成员变量是一种好的做法吗?,c++,C++,假设我有一个指针,我希望它被初始化为nullptr。哪个选项更好,创建一个构造函数,将该成员变量设置为nullptr,或者在头文件的声明中将其初始化为nullptr 有什么区别吗?后者是否被视为不良做法 提前感谢。在类主体中初始化成员完全等同于在construcor中的成员初始值设定项列表中进行初始化。(但如果在这两个位置都提供了初始值设定项,则成员init list将覆盖类主体中的初始值设定项。) 尽可能在类主体中初始化是一种很好的做法,因为它不太容易出错(如果忘记初始化新添加的成员,您会立即

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

有什么区别吗?后者是否被视为不良做法


提前感谢。

在类主体中初始化成员完全等同于在construcor中的成员初始值设定项列表中进行初始化。(但如果在这两个位置都提供了初始值设定项,则成员init list将覆盖类主体中的初始值设定项。)


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

如果我正确理解了您的问题,此链接应该会为您提供一些信息:

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

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

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

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

示例,坏的

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
    // ...
};
强制执行

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


默认初始值设定项将应用于每个构造函数,因此,如果向类添加新构造函数,则无需检查每个成员。您还可以在重写该值的构造函数中更改默认初始化。我总是使用默认初始化而不是构造函数初始化,首先是因为您可以确保每个构造函数都会使用默认初始化,其次(IMO)可读性更好。我认为唯一可能的错误做法是首先使用指针。如果用例真的需要一个指针,那么使用一个智能指针,比如,它的默认构造函数会将它初始化为“null”。类似的问题:如果后者能够覆盖前者,为什么它是完全等价的?如果它们是等价的,我希望使用两种方法分配不同的值会是UB或其他东西。@Enlico我想他的意思是,如果你做一个或另一个,结果是相同的。他没有说要同时做这两件事time@EnlicoRoQuOTriX说了什么,但我编辑了以使其更清楚。顺便说一句,在类主体中,您不必有构造函数,因此类可能是聚合的,您可能没有用户提供的构造函数,等等。请不要发布仅链接的答案,至少引用你所指的部分。好吧,很抱歉,我不认为这是必要的,因为链接直接指向该部分,我会编辑我的消息(不用担心:)有时链接页面会被移动,如果几年后,有人偶然发现你的答案,却发现一个死链接,这将是令人沮丧的。因此,最好至少在这里包含一些信息。但也要保持联系。