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]
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当一个问题是主题问题时,这意味着它应该用一个解决问题的答案来回答,并且是“正确的”我认为这在这里是不可能实现的。根据人们的观点和编码风格,你可以得到不同的答案,不可能客观地说哪些是“对的”,哪些是“错的”