Класс памяти static
Статические переменные имеют два важных применения.
Локальная статическая переменная сохраняет предыдущее значение при повторном входе в блок.
Пример.
Int f ()
{
static int called=0;
++called;
. . . .
return called;
}
Область действия статических переменных ограничена функцией, в которой она объявлена.
Статические функции видны только внутри файла, в котором они определены. В отличии от обычных функций, к которым возможен доступ из других файлов, статическая функция доступна только в своем файле.
static int goo (int a)
{
. . . .
}
int foo (int a)
{
. . . .
b=goo (a); //goo доступна только в этом файле
. . . .
}
(7.10) что делает эта программа.
/* Статические переменные */
#include <stdio.h>
int Next1(void);
int Next2(void);
main()
{
int i;
printf("\nCalling Next1():\n");
for (i = 1; i <= 10; i++)
printf(" %d", Next1());
printf("\nCalling Next2():\n");
for (i = 1; i <= 10; i++)
printf(" %d", Next2());
return 0;
}
int Next1(void)
{
static int value = 1; /* Static variable */
return value++;
}
int Next2(void)
{
int value = 1; /* Normal local variable */
return value++;
}
Некоторые особенности компоновки.
Имя, объявленное в области видимости файла, как static, является локальным и скрыто от других файлов. Так же ведут себя функции, объявленные inline и переменные с модификатором const. Переменные const, находящиеся в области видимости файла, но не являющиеся статической, может быть задан внешний тип компоновки с помощью объявления ее extern.
Программы на Си++ могут компоноваться с программами на Си на Паскале, в зависимости от реализации.
Пространство имен.
Си++ унаследовал от Си единое пространство имен. Возникающие из-за этого конфликты привели к появлению в Си++ области видимости пространства имен.
Namespace LMPinc
{
class purrles{…};
class toys{…};
. . . .
}
Идентификатор пространства имен может быть использован, как часть идентификатора, разрешающего область видимости. Идентификатор_пространства_имен :: идентификатор
Существуют также объявление using, которое позволяет получить доступ ко всем именам из пространства имен.
using namespace LMPinc;
toys top; //используется LMPinc :: toys
Пространства имен могут быть вложенными.
namespase LMPout
{
int n;
namespace LMPin
{
int sq()
{
return n*n;
} //LMPout :: n
void pr_mu_logo():
}
void LMPin :: pr_mu_logo()
{
cout<<”LMPinc”<<eldl;
}
}
Вместо глобальных статических переменных может использоваться безымянное пространство имен. Например,
Namespace
{
int count=0;
} //здесь count уникальный.
// count доступна в остальной части файла
void chg_cnt(int i)
{
count=i;
}
Перечислимые типы.
Ключевое слово enum используется для объявления особого целого типа с набором именованных целых констант, называемых константами перечислимого типа или перечислимыми константами.
enum suit {clubs, diamonds, hearts, spides};
0 1 2 3
по умолчанию
Перечислимые константы могут быть инициализированы произвольными целыми константами, а также целыми выражениями
enum ages {laura=7, ira=8, harold=59, philip=harold+7};
66
Теговые имена и имена перечислимых констант должны быть уникальны в пределах области видимости.
Перечислимые константы могут быть преобразованы к обычному целому типу, но не наоборот.
enum signal {off,on}a=on; //a присвоено значение on=1
enum answer {no, yes, maybe=-1}b;
enum negative {no, false}c; //недопустимо no и false переобъяв- лены
int i, j=on; //допустимо
a=off; //допустимо
i=a; //допустимо
b=a; // недопустимо, разные типы
b=static_cast<answer>(a); //допустимо
b=(a? No : yes);
