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-переменной и одинаковости её значения для всех объектов класса и без использования оных.