C++ 在一行中初始化多个私有变量
我正在研究遗留代码,它看起来如下所示:C++ 在一行中初始化多个私有变量,c++,constructor,default-constructor,C++,Constructor,Default Constructor,我正在研究遗留代码,它看起来如下所示: class Foo { public: Foo(); private: bool a1, a2, a3 /*, ...*/, a50; }; Foo::Foo() { a1 = a2 = a3 /* = ... */ = a50 = false; } 这太乱了。是否有一种方法可以将同一时间的所有私有变量默认为一个与上述不同的值?我不想使用初始值设定项列表,因为变量太多了 我知道bool的默认构造函数赋值为false-可以利用
class Foo {
public:
Foo();
private:
bool a1, a2, a3 /*, ...*/, a50;
};
Foo::Foo() {
a1 = a2 = a3 /* = ... */ = a50 = false;
}
这太乱了。是否有一种方法可以将同一时间的所有私有变量默认为一个与上述不同的值?我不想使用初始值设定项列表,因为变量太多了
我知道bool
的默认构造函数赋值为false-可以利用它吗?试试这个
class Foo
{
private:
bool a1{}, a2{}, /*...,*/ a50{};
};
Foo::Foo (bool aa) : a1 (aa) , a2 (aa), a3 (aa),/*......*/a50(aa){}
试试这个
Foo::Foo (bool aa) : a1 (aa) , a2 (aa), a3 (aa),/*......*/a50(aa){}
试试这个
Foo::Foo (bool aa) : a1 (aa) , a2 (aa), a3 (aa),/*......*/a50(aa){}
试试这个
Foo::Foo (bool aa) : a1 (aa) , a2 (aa), a3 (aa),/*......*/a50(aa){}
有许多可能的方法可以做到这一点,但它们都非常相似。无论如何,您将使用不同的形式分配每个变量 我认为最好的主要方法是在构造函数中逐行正确地分配所有变量。它可能不紧凑,但它最有意义,您可以轻松查看变量的默认值:
Foo::Foo() {
a1 = false;
a2 = false;
/*...*/
a50 = false;
}
您描述的另一种方法是使用赋值运算符:
Foo::Foo() {
a1 = a2 = a3 /* = ... */ = a50 = false;
}
另一个允许在构造函数声明之后立即初始化变量:
Foo::Foo() :
a1(false),
a2(false),
/*...*/
a50(true)
{ }
如果我忘记了任何方法,请将其写入评论。有很多可能的方法,但它们都非常相似。无论如何,您将使用不同的形式分配每个变量 我认为最好的主要方法是在构造函数中逐行正确地分配所有变量。它可能不紧凑,但它最有意义,您可以轻松查看变量的默认值:
Foo::Foo() {
a1 = false;
a2 = false;
/*...*/
a50 = false;
}
您描述的另一种方法是使用赋值运算符:
Foo::Foo() {
a1 = a2 = a3 /* = ... */ = a50 = false;
}
另一个允许在构造函数声明之后立即初始化变量:
Foo::Foo() :
a1(false),
a2(false),
/*...*/
a50(true)
{ }
如果我忘记了任何方法,请将其写入评论。有很多可能的方法,但它们都非常相似。无论如何,您将使用不同的形式分配每个变量 我认为最好的主要方法是在构造函数中逐行正确地分配所有变量。它可能不紧凑,但它最有意义,您可以轻松查看变量的默认值:
Foo::Foo() {
a1 = false;
a2 = false;
/*...*/
a50 = false;
}
您描述的另一种方法是使用赋值运算符:
Foo::Foo() {
a1 = a2 = a3 /* = ... */ = a50 = false;
}
另一个允许在构造函数声明之后立即初始化变量:
Foo::Foo() :
a1(false),
a2(false),
/*...*/
a50(true)
{ }
如果我忘记了任何方法,请将其写入评论。有很多可能的方法,但它们都非常相似。无论如何,您将使用不同的形式分配每个变量 我认为最好的主要方法是在构造函数中逐行正确地分配所有变量。它可能不紧凑,但它最有意义,您可以轻松查看变量的默认值:
Foo::Foo() {
a1 = false;
a2 = false;
/*...*/
a50 = false;
}
您描述的另一种方法是使用赋值运算符:
Foo::Foo() {
a1 = a2 = a3 /* = ... */ = a50 = false;
}
另一个允许在构造函数声明之后立即初始化变量:
Foo::Foo() :
a1(false),
a2(false),
/*...*/
a50(true)
{ }
如果我忘记了任何方法,请将其写入注释。您可以有另一个类(在单独的标题中),如下所示
class myBool {
public:
myBool(int x = 1) { _m = x; }
operator bool() const { return 0 < _m; }
private:
int _m;
};
这将把所有bool初始化为您在myBool中设置的默认值。您可能需要向myBool类添加更多的方法,以将其用作一个完整的数据类型。以上是解释答案的最低要求。您可以有另一个类(在单独的标题中),如下所示
class myBool {
public:
myBool(int x = 1) { _m = x; }
operator bool() const { return 0 < _m; }
private:
int _m;
};
这将把所有bool初始化为您在myBool中设置的默认值。您可能需要向myBool类添加更多的方法,以将其用作一个完整的数据类型。以上是解释答案的最低要求。您可以有另一个类(在单独的标题中),如下所示
class myBool {
public:
myBool(int x = 1) { _m = x; }
operator bool() const { return 0 < _m; }
private:
int _m;
};
这将把所有bool初始化为您在myBool中设置的默认值。您可能需要向myBool类添加更多的方法,以将其用作一个完整的数据类型。以上是解释答案的最低要求。您可以有另一个类(在单独的标题中),如下所示
class myBool {
public:
myBool(int x = 1) { _m = x; }
operator bool() const { return 0 < _m; }
private:
int _m;
};
这将把所有bool初始化为您在myBool中设置的默认值。您可能需要向myBool类添加更多的方法,以将其用作一个完整的数据类型。以上是解释答案的最低要求。这里有一个替代方案,以防对您有用 将要批量初始化的数据放入其自身的结构中,使其成为默认的false/0值:
struct MyData
{
bool a, b, c, d;
std::string e, f;
};
现在从该结构继承(私有或其他),并在构造函数的初始化列表中显式初始化它:
class MyClass : private MyData
{
public:
MyClass()
: MyData()
{
}
};
这会将所有bool设置为false,字符串为空,任何int变为0,指针变为null,等等
如果您忘记将结构显式地放入初始化列表中,它的一些成员可能未初始化。这里有一个替代方案,以防对您有用 将要批量初始化的数据放入其自身的结构中,使其成为默认的false/0值:
struct MyData
{
bool a, b, c, d;
std::string e, f;
};
现在从该结构继承(私有或其他),并在构造函数的初始化列表中显式初始化它:
class MyClass : private MyData
{
public:
MyClass()
: MyData()
{
}
};
这会将所有bool设置为false,字符串为空,任何int变为0,指针变为null,等等
如果您忘记将结构显式地放入初始化列表中,它的一些成员可能未初始化。这里有一个替代方案,以防对您有用 将要批量初始化的数据放入其自身的结构中,使其成为默认的false/0值:
struct MyData
{
bool a, b, c, d;
std::string e, f;
};
现在从该结构继承(私有或其他),并在构造函数的初始化列表中显式初始化它:
class MyClass : private MyData
{
public:
MyClass()
: MyData()
{
}
};
这会将所有bool设置为false,字符串为空,任何int变为0,指针变为null,等等
如果您忘记将结构显式地放入初始化列表中,它的一些成员可能未初始化。这里有一个替代方案,以防对您有用 将要批量初始化的数据放入其自身的结构中,使其成为默认的false/0值:
struct MyData
{
bool a, b, c, d;
std::string e, f;
};
现在在