【发布时间】:2014-03-01 17:45:35
【问题描述】:
从 C++11 开始,我们可以默认在类中构造变量,如下所示:
class Foo{
private:
int bar = 0;
};
我很少看到有人使用这个功能
这是一个好习惯吗?
【问题讨论】:
标签: c++ c++11 coding-style
从 C++11 开始,我们可以默认在类中构造变量,如下所示:
class Foo{
private:
int bar = 0;
};
我很少看到有人使用这个功能
这是一个好习惯吗?
【问题讨论】:
标签: c++ c++11 coding-style
这是一个风格问题,但有一些考虑因素希望是通用的:
如果你的类的所有构造函数都必须以相同的方式初始化一个成员,因为初始值在某种意义上是类的不变量的一部分,那么它就更具可读性和自记录性,并且使用起来也更短内联初始化程序,如果您需要更改初始值,重复数据删除会消除错误源。
否则,如果不同的构造函数提供不同的初始值,那么您不应该有内联初始化器,即使技术上允许这样做。
【讨论】:
我没有看到这种方法有任何不良做法。即使在 Java 等高级语言中也允许这样做。它减少了构造函数中的代码行数。
【讨论】:
我看到的唯一大缺点是它可能会导致人们在类定义中暴露出比必要更多的实现细节。目前,如果您在 MyClass.cpp 中初始化一个成员,那么您以后可以轻松地更改该值。如果您在 MyClass.h 中初始化该成员,那么如果您稍后更改该值,则可能需要进行大量重新编译。
在Java中,你没有这种头和实现之间的分离,所以这种情况不能和C++相比。
【讨论】:
C++11 允许在类中初始化非静态数据成员。
这通常可以节省一些打字时间。考虑以下示例:
class Foo {
public:
Foo() : a_{5}, b_{7}, s_{"Foo"}, bar_{"Test"} {}
Foo(int x) : a_{x}, b_{7}, s_{"Foo"}, bar_{"Test"} {}
Foo(double d) : a_{5}, b_{g(d)}, s_{"Foo"}, bar_{"Test"} {}
int someFunc();
private:
int a_;
int b_;
std::string s_;
Bar bar_;
};
恕我直言,使用类内初始化将使代码更具可读性。
class Foo {
public:
Foo() = default;
Foo(int x) : a_{x} {} // Initialization list overrides in-class initialization.
Foo(double d) : b_{g(d)} {} // Same here.
int someFunc();
private:
int a_ = 5;
int b_ = 7;
std::string s_{"Foo"};
Bar bar_{"Test"};
};
我会说尽可能使用它。 this answer 中描述的情况适用时例外。
【讨论】: