Должен ли я инициализировать статический член данных const с помощью инициализатора в классе или в его определении вне класса? - PullRequest
0 голосов
/ 11 июля 2019

Если у меня есть класс, имеющий статический элемент данных const, то как лучше всего его инициализировать:

class Circle{
    public:
        //...
    private:
        static const double PI_ = 3.14; // 1
        //static const double PI_; // 2
};

double Circle::PI_; // 1   is this redundant?
//double Circle::PI_ = 3.14;

Как вы можете видеть выше, я впервые инициализировал PI_ с помощью инициализатора в классе, а затем определил его вне класса без какого-либо инициализатора.

А во втором я просто объявил его внутри класса без инициализатора и определил его вне класса с помощью инициализатора.

  • Какой самый лучший способ?
  • Является ли определение PI_ вне класса избыточным, пока я предоставлял инициализатор в классе?
  • Могу ли я сказать, что предоставление инициализатора в классе для константного статического члена данных считается "определением", а не "объявлением"?

  • Также в "C ++ primer 5th ed:

    "*If the member is used only in contexts where the compiler can substitute the member’s value, then an initialized const or constexpr static need not be separately defined. However, if we use the member in a context in which the value cannot be substituted, then there must be a definition for that member. For example, if the only use we make of period is to define the dimension of daily_tbl, there is no need to define period outside of Account. However, if we omit the definition, it is possible that even seemingly trivial changes to the program might cause the program to fail to compile because of the missing definition. For example, if we pass Account::period to a function that takes a const int&, then period must be defined.*"

Но я пробовал и без определения работал вне класса? !!!

Спасибо!

1 Ответ

0 голосов
/ 11 июля 2019

Было бы лучше, если бы вы использовали constexpr, а это значит, что вы можете оставить все это в пределах определения класса

class Circle{
public:
    //...
private:
    static constexpr double PI_ = 3.14; // 1
};
...