Подтвердить что ты не робот

Статическая константа по сравнению с константой

Я не понимаю разницы между этими двумя утверждениями в моем классе С++:

class MyClass {
  public:
  private:
     const static int var = 0;            // Option 1
     static const int var = 0;            // Option 2
};

В чем разница b/w Вариант 1 и Вариант 2? Они оба компилируются.

4b9b3361

Ответ 1

Они означают одно и то же. Вы можете свободно выбирать то, что, по вашему мнению, легче читать.

В C вы должны поместить static в начале, но это еще не требуется. Я не уверен, что С++ следовал C в этом отношении.

6.11.5 Спецификаторы класса хранения

1 Размещение спецификатора класса хранения, отличного от начала объявления спецификаторы в декларации являются устаревшей функцией.

Ответ 2

static, const (здесь, во всяком случае), и тип (например, int) являются частью спецификатора объявления. Исторически спецификатор объявления был неупорядоченным списком ключевых слов и имен типов, поэтому:

static unsigned int const var;
static unsigned const int var;
static int unsigned const var;
static int const unsigned var;
static const unsigned int var;
static const int unsigned var;
unsigned static int const var;
unsigned static const int var;
unsigned int static const var;
unsigned int const static var;
unsigned const static int var;
unsigned const int static var;
int static unsigned const var;
int static const unsigned var;
int unsigned static const var;
int unsigned const static var;
int const static unsigned var;
int const unsigned static var;
const static unsigned int var;
const static int unsigned var;
const unsigned static int var;
const unsigned int static var;
const int static unsigned var;
const int unsigned static var;

были законными, и все это означало одно и то же.

Я думаю, что это все еще так, как на C, так и на С++, но если я не ошибаюсь, C устарел, поставив спецификатор класса хранения (static) где угодно, но в начале. Это во всяком случае почти универсальное соглашение, поэтому вы обычно должны положить staticextern и т.д.) в начале.

Обратите внимание, что неупорядоченное относится только к спецификатору объявления. В последующих деклараторах должен следовать cv-квалификатор (ы) что они квалифицируют; по причинам ортогональности вы должны нормально всегда ставьте cv-квалификаторы после того, что они изменяют (т.е. int const, а не const int).

Наконец, это, как представляется, широко распространенное соглашение о представлении типа модификаторы перед типом, с модификатором подписи (signed или unsigned) перед модификатором длины (short, long или long long). Он также довольно часто бросает int, если модификатор присутствуют, поэтому люди пишут unsigned, а не unsigned int, и long, а не long int. Однако это далеко не универсально.

Учитывая это, первый способ написания декларации выше предпочтительнее, хотя вполне приемлемо отказаться от int.

Ответ 3

Они одинаковы. Но я всегда буду использовать вариант 2 по той простой причине, что ключевые слова const и int лучше подходят для сопоставления, поскольку они определяют тип данных. Если ключевое слово static определяет доступность этой переменной.