Чтение онлайн

на главную - закладки

Жанры

Шрифт:

28. Описание

Имя вводится в программе с помощью описания, которое задает его тип и, возможно, начальную величину. Даны понятия описания, определения, области видимости имен, времени существования объектов и типов.

Перед использованием имени (идентификатора) в C++ программе оно должно быть описано. То есть следует задать его тип, чтобы сообщить компилятору, к какого вида объектам относится имя. Рассмотрим несколько примеров, показывающих разнообразие описаний:

char ch;

int count = 1;

char* name = «Bjarne»;

struct complex {float re, im;};

complex cvar;

extern complex sqrt(complex);

extern int error_number;

typedef complex point;

float real(complex* p) {return p->re;};

const double pi = 3.1415926535897932385;

struct user;

Большинство

описаний служит также определениями; т. е. они к тому же определяют для имени сущность, к которой оно относится. Для ch, count и cvar этой сущностью служит соответствующий объем памяти, который должен применяться как переменная, – эта память будет выделена. Для real это заданная функция, для constant pi это значение 3.1415926535897932385, для com28б plex этой сущностью служит новый тип. Для point это тип complex, поэтому point принимает смысл complex. Только описания

extern complex sqrt(complex); extern int errornumber; struct user;

не служат одновременно определениями. То есть объект, к которому они относятся, должен быть определен где-то еще. Код (тело) функции sqrt должен определяться определенным описанием, память для переменной errornumber типа int должна выделяться другим описанием, и какое-то другое описание типа user должно определять, что он из себя представляет. В C++ программе всегда должно присутствовать только одно определение каждого имени, но описаний может быть большое количество и все описания должны согласовываться с типом объекта, которого они касаются, поэтому в этом фрагменте есть две ошибки:

int count;

int count; // ошибка: переопределение exnern int errornumber; exnern int errornumber; // ошибка: несоответствие типов

29. Описание и скрытие имен

Описание определяет имя в области видимости. Таким образом, имя может применяться только в некоторой части программы. Для имени, которое описано в функции (такое имя часто называют локальным), эта область видимости располагается от точки описания до конца блока, в котором появилось описание. Для имени не в функции и не в классе (называемого часто глобальным именем) область видимости находится от точки описания до конца файла, в котором появилось описание. Описание имени в блоке может прятать описание во внутреннем блоке или глобальное имя, т. е. можно переопределять имя внутри блока с целью ссылки на другой объект. После выхода из блока имя опять получает свое прежнее значение.

Например:

int x; // глобальное x

f {

int x; // локальное x прячет глобальное x x = 1; // присвоить локальному x

{

int x; // прячет первое локальное x

x = 2; // присвоить второму локальному x

}

x = 3; // присвоить первому локальному x

}

int* p = &x // взять адрес глобального x

Скрытие имен обязательно при написании больших программ. Но читающий человек легко может не заметить, что имя скрыто, и некоторые ошибки, которые возникают вследствие этого, очень тяжело обнаружить, в основном потому, что они редкие. Применение для глобальных переменных имен i или x напрашивается на неприятности. С помощью операции разрешения

области видимости:: можно применять скрытое глобальное имя. Например: int x;

f

{

int x = 1; // скрывает глобальное x::x = 2; // присваивает глобальному x

}

Однако возможности применять скрытое локальное имя нет. Область видимости имени начинается точкой описания. То есть имя можно применять даже для задания его собственного значения. К примеру:

int x;

f {

int x = x; // извращение

}

30. Имена переменных

Имя (идентификатор) включает в себя последовательность букв и цифр. Первый символ должен являться буквой. Знак подчерка считается буквой. C++ не ограничивает число символов в имени, но определенные части реализации находятся вне ведения автора компилятора (в частности, загрузчик), и они подобные ограничения налагают.

Приведем примеры последовательностей символов, которые не могут применяться как идентификаторы:

012 a fool $sys class 3var pay.due foo~bar.name if

Буквы в верхнем и нижнем регистрах являются различными, т. е. Count и count – разные имена, но вводить имена, почти не отличающиеся друг от друга, нежелательно. Имена, которые начинаются с подчерка, по традиции применяются для специальных средств среды выполнения, поэтому применять такие имена в прикладных программах не стоит.

Каждое имя (идентификатор) в C++ программе обладает ассоциированным с ним типом. Данный тип определяет, какие операции возможно применить к имени, а также как эти операции интерпретируются.

Целый тип char удобнее всего применять для хранения и обработки символов на некотором компьютере; обычно это 8-битовый байт. Размеры объектов C++ выражаются в единицах размера char, т. е. можно записать sizeof(char)==1.

Тип unsigned char является беззнаковым, и при его использовании имеем более переносимые программы, но при применении его вместо char могут появиться значительные потери в эффективности.

Тип void (пустой) синтаксически проявляет себя как основной тип. Но применять его следует только как часть производного типа, объектов типа void нет. Он применяется для указания, что функция не возвращает значение, или в качестве базового типа для указателей на объекты неизвестного типа.

void f // f не возвращает значение

void* pv; // указатель на объект неизвестного типа

Для большинства типов T T* служит типом указатель на T. То есть в переменной типа T* может располагаться адрес объекта типа T. Для указателей на вектора и указателей на функции необходимо пользоваться более сложной записью:

int* pi;

int* pi;

char** cpp; // указатель на указатель на char

int (*vp)[10]; // указатель на вектор из 10 int’ов

int (*fp)(char, char*); // указатель на функцию

// получающую параметры (char, char*)

// и возвращающую int

31. Разыменование

Основной операцией над указателем является разыменование, т. е. ссылка на объект, на который указывает указатель. Эту операцию также именуют косвенным обращением. Например:

char c1 = 'a';

char* p = &c1 // в p хранится адрес c1 char c2 = *p; // c2 = 'a'

Над указателями можно осуществлять определенные арифметические действия. К примеру, функция, подсчитывающая число символов в строке (не считая завершающего 0):

Поделиться:
Популярные книги

Народ, да!

Коллектив авторов
Старинная литература:
мифы. легенды. эпос
5.00
рейтинг книги
Народ, да!

Сборник "Солдат удачи"

Авраменко Александр Михайлович
Фантастика:
боевая фантастика
6.83
рейтинг книги
Сборник Солдат удачи

Гоголь

Степанов Николай Леонидович
324. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Гоголь

Егерь. Системный зверолов

Скиба Николай
1. Зверолов
Фантастика:
рпг
уся
фэнтези
фантастика: прочее
попаданцы
6.50
рейтинг книги
Егерь. Системный зверолов

Прорыв реальности

Бурносов Юрий Николаевич
Новая зона
Фантастика:
боевая фантастика
6.40
рейтинг книги
Прорыв реальности

История Похитителя Тел

Райс Энн
4. Хроники вампиров
Фантастика:
ужасы и мистика
8.87
рейтинг книги
История Похитителя Тел

Тайник

Джордж Элизабет
12. Инспектор Линли
Детективы:
криминальные детективы
7.78
рейтинг книги
Тайник

Пьессы

Плавт Тит Макций
Старинная литература:
античная литература
7.00
рейтинг книги
Пьессы

Профессия: театральный критик

Якубовский Андрей
Документальная литература:
критика
5.00
рейтинг книги
Профессия: театральный критик

Открытие мира (Весь роман в одной книге)

Смирнов Василий Александрович
Проза:
классическая проза
русская классическая проза
советская классическая проза
5.00
рейтинг книги
Открытие мира (Весь роман в одной книге)

Ожог

Аксенов Василий Павлович
Проза:
современная проза
6.00
рейтинг книги
Ожог

Глубокое ущелье

Тахир Кемаль
Проза:
роман
5.25
рейтинг книги
Глубокое ущелье

Я бог. Книга XXXIX

Дрейк Сириус
39. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я бог. Книга XXXIX

Хроники Амбера. Книги Мерлина (авторский сборник)

Желязны Роджер Джозеф
Хроники Амбера
Фантастика:
фэнтези
9.26
рейтинг книги
Хроники Амбера. Книги Мерлина (авторский сборник)