【问题标题】:Is initialising const class fields using static methods good or bad practice?使用静态方法初始化 const 类字段是好还是坏?
【发布时间】:2017-10-27 22:56:46
【问题描述】:

我的类包含需要使用函数初始化的 const 字段。使用类的静态方法在构造函数的初始化列表中初始化这些值是否合适?

这样做我还没有遇到问题,但是当我读到“静态初始化惨败”时,我担心我忽略了一些稍后会回来咬我的东西,无论哪种方式我都会而是养成正确初始化的习惯。

例子:

square.hpp:

class Square
{
    const double area;

    static initArea(double length);

    Square(double length);
}

square.cpp

Square::initArea(double length)
{
    return (length * length);
}

Square::Square(double length) :
    area(initArea(length))
{
    return;
}

显然我意识到在这种情况下您不需要函数来计算面积,但实际上该函数会确定更复杂的东西。

【问题讨论】:

  • 您通过投票和选择答案来感谢人们,而不是通过添加问题来感谢人们。除此之外,干得好。
  • 您可能还想在该函数前面加上double 的类型,从构造函数中删除return 并在适当的地方使用public: 说明符。
  • 你可以在 .cpp 文件中将initArea 设为一个免费的静态函数,这样它就不会“污染”类头
  • “静态初始化顺序惨败”是指跨不同文件初始化静态存储持续时间对象(静态数据成员和命名空间范围变量)。您的案例是关于一个非静态数据成员:完全不同的东西。

标签: c++ constructor constants static-methods initializer-list


【解决方案1】:

在构造函数的初始化列表中使用类的静态方法来初始化这些值是否合适?

是的,这绝对合适:静态辅助方法非常适合此任务,因为它们可以在任何对象的上下文之外运行。因此,在初始化列表中调用它们是完全有效的。

内联这样的简单函数可能也是一个好主意。

【讨论】:

  • 太好了,感谢您的确认!在这种情况下,我是否对“静态初始化惨败”感到偏执?或者是否有我应该注意的边缘情况?
  • @user7119460 您没有在此处初始化静态成员 - 静态成员函数与非成员函数几乎相同。只要它们是无状态的(即不使用静态变量)就完全没有问题。
猜你喜欢
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2019-11-20
相关资源
最近更新 更多