C++ 初始化类成员-默认值还是成员初始化列表?

C++ 初始化类成员-默认值还是成员初始化列表?,c++,default-value,initializer-list,default-constructor,member-initialization,C++,Default Value,Initializer List,Default Constructor,Member Initialization,对于何时以及如何在构造函数中初始化类的成员,我有点困惑。如果我理解正确,您可以通过在类定义、构造函数成员初始化器列表中包含默认值,或者通过在构造函数体中赋值来实现这一点。我意识到最好在进入构造函数主体之前进行初始化,但是什么时候应该使用成员初始化器列表,什么时候应该使用默认值 如果我在这里根本上误解了什么,请道歉 你的想法真的有点让人困惑。至少有4种不同的概念 构造函数中的初始化(即使构造函数也可以有一个非平凡的主体) [1] 你做了3次 在下面的示例()中,为了简洁/简单,我使用了st

对于何时以及如何在构造函数中初始化类的成员,我有点困惑。如果我理解正确,您可以通过在类定义、构造函数成员初始化器列表中包含默认值,或者通过在构造函数体中赋值来实现这一点。我意识到最好在进入构造函数主体之前进行初始化,但是什么时候应该使用成员初始化器列表,什么时候应该使用默认值


如果我在这里根本上误解了什么,请道歉

你的想法真的有点让人困惑。至少有4种不同的概念

  • 构造函数中的初始化(即使构造函数也可以有一个非平凡的主体)
  • [1]
你做了3次

在下面的示例()中,为了简洁/简单,我使用了
struct
而不是
class
和内联构造函数

#include <iostream>

struct A 
{ 
    A(int v=1): m(v) {}
    int m; 
};

struct B
{ 
    B(): m(2) {}
    int m; 
};

struct C
{ 
    C()
    {
        m = 3;
    }
    int m; 
};

// since C++11
struct D
{ 
    int m = 11; 
};

int main()
{
    using namespace std;
    #define TRACE(arg) cout << #arg ": " << arg.m << endl; 
    A a1;
    TRACE(a1)
    A a2(4); 
    TRACE(a2)
    B b;
    TRACE(b)
    b.m = 5;
    TRACE(b)
    C c;
    TRACE(c)
    c.m = 6;
    TRACE(c)
    D d;
    TRACE(d)
    d.m = 0;
    TRACE(d)
    #undef TRACE
}
#包括
结构A
{ 
A(intv=1):m(v){}
int m;
};
结构B
{ 
B():m(2){}
int m;
};
结构C
{ 
C()
{
m=3;
}
int m;
};
//自C++11以来
结构D
{ 
int m=11;
};
int main()
{
使用名称空间std;

#define TRACE(arg)cout@Andreas:这个问题没有提到类定义中的默认值,这正是这个问题的主要内容。“什么时候应该使用成员初始化器列表,什么时候应该使用默认值”使用对你更方便的方法,他们会有效地做同样的事情。这不是一个关于你遇到的问题的问题,所以这是一个离题的问题。答案基本上都是基于观点的。我的答案是,作为一般经验法则,如果可以,使用内联初始化。如果不能,使用构造函数初始值设定项列表。如果你不能在构造函数体中赋值。这个问题对我来说似乎完全是主题问题。@TonyK当一个问题是主题问题时,这意味着它应该用一个解决问题的答案来回答,并且是“正确的”我认为这在这里是不可能实现的。根据人们的观点和编码风格,你可以得到不同的答案,不可能客观地说哪些是“对的”,哪些是“错的”