Хорошо, давайте рассмотрим эту маленькую программу
int& add()
{
static int a;
a++;
cout<<"\na="<<a;
return a;
}
static int a объявляет переменную. Статический в этом контексте означает, что есть только место для хранения, и это место используется всякий раз, когда вызывается add. Таким образом, a похож на глобальную переменную, доступ к которой возможен только внутри add.
Возвращаемое значение является справочным. Большинство компиляторов используют указатель внутри для представления ссылки. Здесь вы видите, что возвращается ссылка на статическую переменную a. Любой может изменить его, получив ссылку.
a ++ и cout просты - здесь больше нет комментариев.
int main{
int x,y,m; // declare three ints: x,y,m, all unassigned
int &z = add(); // a is incremented to 1, z is a reference to a
x=add(); // add() returns a reference to a, x copies the value of a
y=add(); // same as above
z++; // increments a, since z is a reference to a
m=add(); // same as x and y, copies the value of a
cout<<"\nx="<<x<<"\ny="<<y<<"\nz="<<z<<"\nm="<<m;
return 0;
}
int & z = add (); вызывает добавление - это означает, что увеличивается. Теперь z является псевдонимом статической переменной a, так как она использует ссылку. х = Add (); снова увеличьте a, но теперь скопируйте значение a, поскольку x имеет тип не int &, а тип int. у - то же самое.
z ++: поскольку z является псевдонимом для a - увеличивает a без печати через cout.
m = add (): увеличить a, скопировать int m, например, x и y.
Вывод будет простым, если вы поймете, почему x, y, m являются копиями, а z - псевдонимом.
Есть еще вопросы?
привет
Tobias