Первый пример:
class SoTest
{
public:
SoTest(const char *name)
{
printf("C'tor called of %s\t(%#x) object\n",name,this);
}
static SoTest ClassStaticObj;
};
static SoTest CStaticObj("CStaticObj");
SoTest SoTest::ClassStaticObj("ClassStaticObj");
void function()
{
for (int i = 0; i < 2;i++)
{
static SoTest FunctionStaticObj("FunctionStaticObj");
SoTest FunctionObj("FunctionObj");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("enter main\n");
function();
function();
getchar();;
return 0;
}
производит:
C'tor called of CStaticObj (0x419168) object
C'tor called of ClassStaticObj (0x419169) object
enter main
C'tor called of FunctionStaticObj (0x419160) object
C'tor called of FunctionObj (0x12fe77) object
C'tor called of FunctionObj (0x12fe77) object
C'tor called of FunctionObj (0x12fe77) object
C'tor called of FunctionObj (0x12fe77) object
Теперь ваш вопрос (ы)
Есть ли разница между
объявив статическую переменную за пределами
функция и объявление статического
переменная внутри функции?
Это совершенно разные проблемы
статическая переменная / функция вне функции не видна за пределами блока компиляции.
Статическая переменная внутри функции размещается в глобальных данных и инициализируется только один раз во время первого появления (смотрите, что FunctionStaticObj был инициализирован после main в отличие от других объектов.
Кроме того, в чем разница между
объявив переменную как статическую и
просто объявить внешнюю переменную?
Опять-таки, статический означает, что он не виден снаружи блока компиляции.
extern означает «здесь не определено, хотя в другом модуле компиляции и компоновщик будет управлять им», поэтому вы можете сделать столько внешних объявлений, сколько вам нужно, но только одно не внешнее определение.