클래스의 static 변수들은 어딘가에 실제로 선언이 되어 있어야 하는데(클래스 선언의 내용은 실제로 메모리에 할당된게 아니기 때문에..) 그게 main() 함수와 같은 파일 내에 있을 뿐입니다. static 변수의 선언을 빼먹으면 이렇게 되죠. http://codepad.org/VB8VWXJ4
외부에서 직접 변경한게 아니라 카운터 클래스에 변경을 요청했고(생성자와 소멸자에서 변경..) 카운트 클래스가 내부에서 변경시킨거죠. 외부에서 바라볼때에는 Num이라는 변수가 있는지 없는지 모르는거에요. 지금은 한 소스파일 내에 같이 있지만 다른 파일에 구현되어 있고 헤더 파일만 가져다 쓴다고 생각해 보세요.