i
является static
членом класса ... так как вы можете получить доступ к static
членам класса, используя обычные методы для экземпляров, они не привязаны ни к какому конкретному экземпляру, поэтомувам не нужно разыменовывать указатель nullptr
(как при использовании оператора sizeof
).Вы также можете получить доступ к полю с помощью простого оператора
return A::i;
, поскольку вам не нужно создавать экземпляр для доступа к нему.Действительно, будучи const
, компилятор позволяет управлять им как постоянным значением, поэтому только в том случае, если вам нужно использовать его адрес (с помощью оператора &
), компилятор может обойти выделение его в постоянной памяти.
Следующий пример обнаружит, что:
#include <iostream>
struct A {
static const int i = 1;
};
int main()
{
std::cout << ((A*)0)->i << std::endl;
std::cout << A::i << std::endl;
}
напечатает
$ a.out
1
1
$ _