#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
Необходимость константного нестатического обьекта заключается не в том, что так решили авторы языка, а авторы языка создали возможность иметь константный обьект в локальной области памяти или в статической области. В первом случаи время жизни обьекта заканчивается при выходе из области, а втором - обьект живет до конца программы. И когда вы выбираете между статическим и нестатическим обьектом, должны учитывать именно этот факт. Например, если немного изменить вашу структуру, то сразу прояснится разница:
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
Можно привести еще много примеров, где правильно или лучше использовать нестатическую константу или наоборот, но я надеюсь и этот пример достаточен, чтобы понять почему константа не статическая(если конечно не обьялен как статическая)
Потому что значения 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
}
Потому что у тебя в стеке создались две структуры и каждая из них имеет свою константу
Потому, что так решили авторы языка.
C++ - это не тот язык, в котором компилятор будет додумывать, что же хотел сказать программист? Тут все проще: сказано - сделано (если сказанное явно не запрещено в стандарте).
Хочешь не статический член-константу - получи. Кто тебя знает, зачем это тебе? Вдруг действительно надо.
А хочешь статический - опиши явно.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Мне нужно в деке указателей найти указатель на элемент, переданный в функцию, и из одного дека этот указатель переместить в другой
Я заметил давно эту проблему, но сейчас она повторилась и я хочу узнать о ней подробнееВсе началось с того, что я устанавливал Android Studio, для...
Ктo-нибудь знает, как сделать вращение карты как в этoй игре? Как этo вooбще устрoенo: 2D или 3D?
Хочу написать читалку, но не имею ни малейшего понятия куда двигатьсяКак я понимаю, нужно получить файл, допустим, fb2, открыть его и отобразить...