Программирование >>  Поддержка объектно-ориентированного программирования 

1 ... 10 11 12 [ 13 ] 14 15 16 ... 120


Возможность использовать скрытое локальное имя отсутствует.

Область видимости имени начинается в точке его описания (по окончании описателя, но еще до начала инициализатора - см. $$R.3.2). Это означает, что имя можно использовать даже до того, как задано его начальное значение. Например:

int x;

void f3()

int x = x;

ошибочное присваивание

Такое присваивание недопустимо и лишено смысла. Если вы попытаетесь транслировать эту программу, то получите предупреждение: использование до задания значения Вместе с тем, не применяя оператора ::, можно использовать одно и то же имя для обозначения двух различных объектов блока. Например:

int x = 11;

void f4() извращенный пример

int y = x; int x = 22; y = x;

глобальное x

локальное x

Переменная y инициализируется значением глобального x, т.е. 11, а затем ей присваивается значение локальной переменной x, т.е. 22. Имена формальных параметров функции считаются описанными в самом большом блоке функции, поэтому в описании ниже есть ошибка:

void f5(int x)

int x;

Здесь x определено дважды в одной и той довольно тонкая ошибка.

ошибка

области видимости. Это хотя и не слишком редкая, но

2.1.2 Объекты и адреса

Можно выделять память для переменных , не имеющих имен, и использовать эти переменные. Возможно даже присваивание таким странно выглядящим переменным , например, *p[a+10]=7. Следовательно, есть потребность именовать нечто хранящееся в памяти . Можно привести подходящую цитату из справочного руководства: Любой объект - это некоторая область памяти, а адресом называется выражение, ссылающееся на объект или функцию ($$R.3.7). Слову адрес (lvalue -left value, т.е. величина слева) первоначально приписывался смысл нечто, что может в присваивании стоять слева . Адрес может ссылаться и на константу (см. $$2.5). Адрес, который не был описан со спецификацией const, называется изменяемым адресом.

2.1.3 Время жизни объектов

Если только программист не вмешается явно, объект будет создан при появлении его определения и уничтожен, когда исчезнет из области видимости. Объекты с глобальными именами создаются, инициализируются (причем только один раз) и существуют до конца программы. Если локальные объекты описаны со служебным словом static, то они также существуют до конца программы. Инициализация их происходит, когда в первый раз управление проходит через описание этих объектов, например:

int a = 1;

void f()

int b = 1;

static int c cout << a =

<< a+ +

инициализируется инициализируется

при каждом вызове f() только один раз



<< b = << b++

<< c = << c++ << \n;

int main()

while (a < 4) f();

Здесь программа выдаст такой результат:

a = 1 b = 1 c = 1 a = 2 b = 1 c = 2 a = 3 b = 1 c = 3

Из примеров этой главы для краткости изложения исключена макрокоманда #include <iostream>. Она нужна лишь в тех из них, которые выдают результат.

Операция ++ является инкрементом, т. е. a++ означает: добавить 1 к переменной a.

Глобальная переменная или локальная переменная static, которая не была явно инициализирована, инициализируется неявно нулевым значением (#2.4.5). Используя операции new и delete, программист может создавать объекты, временем жизни которых он управляет сам (см. $$3.2.6).

2.2 ИМЕНА

Имя (идентификатор) является последовательностью букв или цифр. Первый символ должен быть буквой. Буквой считается и символ подчеркивания . Язык С++ не ограничивает число символов в имени. Но в реализацию входят программные компоненты, которыми создатель транслятора управлять не может (например, загрузчик), а они, к сожалению, могут устанавливать ограничения. Кроме того, некоторые системные программы, необходимые для выполнения программы на С++, могут расширять или сужать множество символов, допустимых в идентификаторе. Расширения (например, использование $ в имени) могут нарушить переносимость программы. Нельзя использовать в качестве имен служебные слова С++ (см. $$R.2.4), например:

hello this is a most unusially long name DEFINED foO bAr u name HorseSense

var0 var1 CLASS class

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

012 a fool $sys class 3var

pay.due foo~bar .name if

Заглавные и строчные буквы считаются различными, поэтому Count и count - разные имена. Но выбирать имена, почти не отличающиеся друг от друга, неразумно. Все имена, начинающиеся с символа подчеркивания, резервируются для использования в самой реализации или в тех программах, которые выполняются совместно с рабочей, поэтому крайне легкомысленно вставлять такие имена в свою программу. При разборе программы транслятор всегда стремится выбрать самую длинную последовательность символов, образующих имя, поэтому var1 0 - это имя, а не идущие подряд имя var и число 10. По той же причине elseif - одно имя (служебное), а не два служебных имени else и if.

2.3 ТИПЫ

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

int error number; float real(complex* p);

Поскольку переменная error number описана как int (целое), ей можно присваивать, а также можно использовать ее значения в арифметических выражениях. Функцию real можно вызывать с параметром,



содержащим адрес complex. Можно получать адреса и переменной, и функции. Некоторые имена, как в нашем примере int и complex, являются именами типов. Обычно имя типа нужно, чтобы задать в описании типа некоторое другое имя. Кроме того, имя типа может использоваться в качестве операнда в операциях sizeof (с ее помощью определяют размер памяти, необходимый для объектов этого типа) и new (с ее помощью можно разместить в свободной памяти объект этого типа). Например:

int main()

int* p = new int;

cout << sizeof(int) = << sizeof(int) \n;

Еще имя типа может использоваться в операции явного преобразования одного типа к другому ($$3.2.5), например:

float f; char* p; ...

long ll = long(p); преобразует p в long

int i = int(f); преобразует f в int

2.3.1 Основные типы

Основные типы С++ представляют самые распространенные единицы памяти машин и все основные способы работы с ними. Это:

char

short int int

long int

Перечисленные типы используются для представления различного размера целых. Числа с плавающей точкой представлены типами:

float double long double

Следующие типы могут использоваться для представления без знаковых целых, логических значений, разрядных массивов и т.д.:

unsigned char unsigned short int unsigned int unsigned long int

Ниже приведены типы, которые используются для явного задания знаковых типов:

signed char signed short int signed int signed long int

Поскольку по умолчанию значения типа int считаются знаковыми, то соответствующие типы с signed являются синонимами типов без этого служебного слова. Но тип signed char представляет особый интерес: все 3 типа - unsigned char, signed char и просто char считаются различными (см. также $$R.3.6.1).

Для краткости (и это не влечет никаких последствий) слово int можно не указывать в многословных типах, т.е. long означает long int, unsigned - unsigned int. Вообще, если в описании не указан тип, то предполагается, что это int. Например, ниже даны два определения объекта типа int:

const a = 1; небрежно, тип не указан static x; тот же случай



1 ... 10 11 12 [ 13 ] 14 15 16 ... 120

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика