Статическая константа по сравнению с константой
Я не понимаю разницы между этими двумя утверждениями в моем классе С++:
class MyClass {
public:
private:
const static int var = 0; // Option 1
static const int var = 0; // Option 2
};
В чем разница b/w Вариант 1 и Вариант 2? Они оба компилируются.
Ответы
Ответ 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
) где угодно, но в начале. Это во всяком случае
почти универсальное соглашение, поэтому вы обычно должны положить static
(и extern
и т.д.) в начале.
Обратите внимание, что неупорядоченное относится только к спецификатору объявления.
В последующих деклараторах должен следовать 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
определяет доступность этой переменной.
Ответ 4
Они одинаковы.
См. Обсуждение: http://bytes.com/topic/c/answers/140177-const-static-vs-static-const