2
aUruMЦитата:
Но я вот задался вопросом: а для чего это было сделано, зачем повторно объявлять атрибут, который уже был объявлен в описании класса?
Можно ещё совсем упрощенно объяснить -- выделение памяти под обычный элемент класса, например "поле"
field в классе
struct myclass {int field;};, происходит когда мы объявляем переменную-объект этого класса (e.g.
myclass myobject;) или создаем этот объект оператором
new.
Но если мы объявим
field как
static, т.е. напишем
struct myclass {static int field;};, этот элемент должен быть доступен даже просто как
myclass::field, причем вообще без необходимости создания объекта класса. Спрашивается, а где-же тогда выделяется память под такую переменную? Вот именно это лишнее определение
static int myclass::field; вне класса и решает эту проблему.
Цитата:
Может быть, это связано с какими-то ограничениями старых компиляторов?
Хм, интересная мысль. Я слышал, что некоторые компиляторы действительно позволяют обходится единственным определением (с инициализацией)
static-элемента в пределах определения класса. Наверное что-то вроде
struct myclass {static const int field=2;};, но это не совсем по стандарту и при необходимости должно быть заменено тем же
enum'ом. Как с этим дела обстоят в новом C++11 -- пока не знаю.
Кстати, коль скоро
static-методы в отличии от
static-данных не требуют дублирования описания, вместо таких переменных класса можно попробовать использовать методы. Например
struct myclass {static int field(){return 2;}}; :)
Ok, необходимость повторного описания
static-переменных выглядит как техническое ограничение. Но можно привести простой пример, демонстрирующий существенность такого поведения. Скажем, есть класс в заголовке. Он используется в другом сpp-файле. Как должен был бы действовать компилятор, чтобы обойтись одним определением
static-переменной в самом классе? Трудно сказать. Ведь этот заголовок может использоваться многими файлами, и, неявно, память должна была бы выделяться либо в одном из них (в каком?), либо в каждом из них, что в свою очередь, очевидно, может нарушить требование единственности
static-переменной и одинаковости её значения для всех объектов класса и без использования оных.