Почему в С++ const не static?

181
02 января 2019, 00:00
#include <iostream>
struct S
{
  const int a = 10; 
};
int main()
{
    S s1;
    S s2;
    std::cout<<&s1.a<<'\n';
    std::cout<<&s2.a<<'\n';
}

output:
0x7787a69678f0

0x7787a6967900

Answer 1

Необходимость константного нестатического обьекта заключается не в том, что так решили авторы языка, а авторы языка создали возможность иметь константный обьект в локальной области памяти или в статической области. В первом случаи время жизни обьекта заканчивается при выходе из области, а втором - обьект живет до конца программы. И когда вы выбираете между статическим и нестатическим обьектом, должны учитывать именно этот факт. Например, если немного изменить вашу структуру, то сразу прояснится разница:

struct S
{
  static const int sa = 10;
  const int a = 10;
  S(int n = 10) : a(n) {}
  void print() const { 
      cout << "non static member: " << a << endl
           << "static member" << sa << endl << endl; 
  }
};

Нестатическую константу вы можете инициализировать инициализатором конструктора, а статическая константа не принадлежит обьекту, она принадлежит статической области памяти, и для всех обьектов этот обьект единственный и имеет одно и то же значение:

S s1, s2(2), s3(3);
s1.print(); // a == 10, sa == 10
s2.print(); //a == 2,   sa == 10
s3.print(); //a == 3,   sa == 10

Можно привести еще много примеров, где правильно или лучше использовать нестатическую константу или наоборот, но я надеюсь и этот пример достаточен, чтобы понять почему константа не статическая(если конечно не обьялен как статическая)

Answer 2

Потому что значения const полей можно устанавливать в конструкторе (в списке инициализации членов), так что у разных объектов они могут быть разные.

struct S
{
    const int a; 
    S(int value) : a(value) {}
};
int main()
{
    S s1(1);
    S s2(2);
    std::cout << s1.a << '\n'; // 1
    std::cout << s2.a << '\n'; // 2
}
Answer 3

Потому что у тебя в стеке создались две структуры и каждая из них имеет свою константу

Answer 4

Потому, что так решили авторы языка.

C++ - это не тот язык, в котором компилятор будет додумывать, что же хотел сказать программист? Тут все проще: сказано - сделано (если сказанное явно не запрещено в стандарте).

Хочешь не статический член-константу - получи. Кто тебя знает, зачем это тебе? Вдруг действительно надо.

А хочешь статический - опиши явно.

READ ALSO
Преобразование итератора в указатель

Преобразование итератора в указатель

Мне нужно в деке указателей найти указатель на элемент, переданный в функцию, и из одного дека этот указатель переместить в другой

167
Почему ПО не видит JDK 10 версии?

Почему ПО не видит JDK 10 версии?

Я заметил давно эту проблему, но сейчас она повторилась и я хочу узнать о ней подробнееВсе началось с того, что я устанавливал Android Studio, для...

195
Как сделать карту как в Breaking the Tower

Как сделать карту как в Breaking the Tower

Ктo-нибудь знает, как сделать вращение карты как в этoй игре? Как этo вooбще устрoенo: 2D или 3D?

189
Как создать читалку на android?

Как создать читалку на android?

Хочу написать читалку, но не имею ни малейшего понятия куда двигатьсяКак я понимаю, нужно получить файл, допустим, fb2, открыть его и отобразить...

200