Инициализировать статический константный неинтегральный элемент данных класса - PullRequest
8 голосов
/ 13 декабря 2011

Рассмотрим пример программы ниже:

#include <iostream>

using namespace std;

class test
{
   public:
      static const float data;
};

float const test::data = 10;   // Line1


int main()
{
   cout << test::data;
   cout << "\n";

   return 0;
}

Обратите внимание на комментарий Line1 в коде примера.

Вопросы:

  1. Есть Line1 делает инициализацию члена даты data?
  2. Является ли Line1 единственным способом инициализации статического константного неинтегрированного члена данных?

Ответы [ 5 ]

8 голосов
/ 13 декабря 2011

Line1 выполняет инициализацию данных элемента date?

Это, безусловно, так же, как и определение объекта. Обратите внимание, что это может быть сделано только в одной единице перевода, поэтому, если определение класса находится в заголовочном файле, то это должно быть в исходном файле.

Является ли Line1 единственным способом инициализации статического константного неинтегрированного члена данных?

В C ++ 03 это было. В C ++ 11 любой статический член литерального типа const может иметь инициализатор в определении класса. Вам все еще нужно определение члена, если он «используется odr» (грубо говоря, если вы делаете что-то, что требует его адреса, а не только его значения). В этом случае определение снова должно быть в одной единице перевода и не должно иметь инициализатора (поскольку в определении класса он уже есть).

4 голосов
/ 13 декабря 2011
  1. Строка1 выполняет определение элемента статических данных data, что включает установку его значения.
  2. Для статических элементов данных нецелых типов определение элемента действительно является единственным местом для установки значения. Для целых чисел, длинных, перечислений и т. Д. Вы можете ввести значение с помощью объявления . Вы все равно должны включить определение, но в этом случае вы не должны указывать какое-либо значение.

РЕДАКТИРОВАТЬ: Как отметил Майк Сеймор, № 2 устарела. Согласно новому стандарту C ++ 11, альтернативный синтаксис, который был зарезервирован только для целочисленных типов стандартами 1998 и C ++ 03, был распространен на все константы, независимо от их типа.

4 голосов
/ 13 декабря 2011

В современном C ++ вы можете инициализировать любое встроенное выражение .Это требует изменения синтаксиса:

class test
{
   public:
      static constexpr float data = 10.0f;
};

float constexpr test::data;
2 голосов
/ 13 декабря 2011
  1. Да.

2.

В C ++ 11 вы можете сказать

class test {
public:
    constexpr static float data = 10.0; // data is implicitly const
};

В C ++ 03 этоДа.

0 голосов
/ 13 декабря 2011

Выполняет ли Line1 инициализацию данных элемента даты?

Да.

Является ли Line1 единственным способом инициализации статического константного неинтегрированногоэлемент данных?

Да.

...