繁体   English   中英

结构中的默认成员值或默认构造函数参数?

[英]Default member values or default constructor parameters in structures?

在现代 C++ 中,我被允许使用默认成员值实现结构,即

struct A
{
  int x = 5;
  float y = 1.0f;
};

但我也可以创建一个没有“默认成员值”的结构,但可以使用默认参数调用其构造函数,如下例所示:

struct B {
  int x;
  float y;

  B(int x_ = 5, float y_ = 1.0f) : x(x_), y(y_) {}
};

我想知道的是,从干净的代码或架构的角度来看,它们之间是否有任何区别? 或者也许还有另一个更重要的区别? 在第一种情况下,我要编写的代码量较少,我相信即使未定义构造函数,我仍然可以像A({2, 3.14f})那样构造 object。

在一个项目中,您将采用哪种方式实现 go,为什么?

没有“正确”的方式来选择初始化形式,这取决于项目的具体限制/环境,甚至您的个人喜好。 但是,我认为在决定 pro/contra 类内初始化程序时应该考虑这些问题。

  1. 优点:可读性。 当您想了解 class 的用途时,您通常会从它的定义开始。 在遍历数据成员时,您的大脑很容易将每个数据成员的初始值放在其类型旁边,而不是扫描可能的多个构造函数。

  2. 优点:当不需要复制粘贴另一个现有构造函数的初始化程序时,添加更多构造函数会容易得多。 使用类内成员初始化器,您在添加构造函数时不太可能忘记一些初始化。

  3. 优点:删除构造函数很容易。 假设您从一个新的 class 开始,添加一堆成员函数、一个构造函数和数据成员。 然后你记得 Scott Meyers 在“非成员函数如何改进封装”中所说的话,你决定将成员函数变成自由函数。 您的类型现在看起来像一个包含一些数据的哑struct - 当它的构造函数不涉及任何业务逻辑时,您可能希望将类型转换为聚合:在 class 初始化程序中,您只需删除构造函数 - 完成。

  4. 相反:当您在class初始化程序中使用 go 时,必须知道正在初始化的数据成员的具体类型。 当所讨论的 class 定义在 header 中时(很可能),编译时间是一个问题(很可能),所讨论的数据成员具有重量级定义(有时)和/或需要非对构造的微不足道的依赖(有时)。 一个简单的指导方针可能是:在 Pimpl-idiom 有用的场景中,它比第 1.-3 点更重要。 并且确实排除了类内初始化程序,因此 go 然后使用 Pimpl 。

最后说明:核心指南建议在C.48中使用类内初始化程序,原因如下:

明确表示希望在所有构造函数中使用相同的值。 避免重复。 避免维护问题。 它导致最短和最有效的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM