Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Встроенные и составные типы данных.




Имена, их области существования и видимости.

Идентификатор — это имя программного объекта. В идентификаторе могут использоваться латинские буквы, цифры и знак подчеркивания. Прописные и строчные буквы различаются. Первым символом идентификатора может быть буква или знак подчеркивания, но не цифра. Пробелы внутри имен не допускаются. Длина идентификатора по стандарту не ограничена, но некоторые компиляторы и компоновщики налагают на нее ограничения. Идентификатор создается на этапе объявления переменной, функции, типа и т. п., после этого его можно использовать в последующих операторах программы. При выборе идентификатора необходимо иметь в виду следующее:

• идентификатор не должен совпадать с ключевыми словами и именами используемых стандартных объектов языка;

• не рекомендуется начинать идентификаторы с символа подчеркивания, поскольку они могут совпасть с именами системных функций или переменных, и, кроме того, это снижает мобильность программы;

• на идентификаторы, используемые для определения внешних переменных, налагаются ограничения компоновщика (использование различных компоновщиков или версий компоновщика накладывает разные требования на имена внешних переменных).

Область действия идентификатора — это часть программы, в которой его можно использовать для доступа к связанной с ним области памяти. В зависимости от области действия переменная может быть локальной или глобальной.

Если переменная определена внутри блока, она называется локальной, область ее действия — от точки описания до конца блока, включая все вложенные блоки. Если переменная определена вне любого блока, она называется глобальной и областью ее действия считается файл, в котором она определена, от точки описания до его конца.

Класс памяти определяет время жизни и область видимости программного объекта (в частности, переменной). Если класс памяти не указан явным образом, он определяется компилятором исходя из контекста объявления. Время жизни может быть постоянным (в течение выполнения программы) и временным (в течение выполнения блока).

Области действия идентификаторов. Каждый программный объект имеет область действия, которая определяется видом и местом его объявления. Существуют следующие области действия:

Блок. Идентификаторы, описанные внутри блока, являются локальными. Область действия идентификатора начинается в точке определения и заканчивается в конце блока, видимость — в пределах блока и внутренних блоков, время жизни — до выхода из блока. После выхода из блока память освобождается. Файл. Идентификаторы, описанные вне любого блока, функции, класса или пространства имен, имеют глобальную видимость и постоянное время жизни и могут использоваться с момента их определения. Функция. Единственными идентификаторами, имеющими такую область действия, являются метки операторов. В одной функции все метки должны различаться, но могут совпадать с метками других функций. Прототип функции. Идентификаторы, указанные в списке параметров прототипа(объявления) функции, имеют областью действия только прототип функции. Класс. Элементы структур, объединений и классов (за исключением статических элементов) являются видимыми лишь в пределах класса. Они образуются при создании переменной указанного типа и разрушаются при ее уничтожении. Поименованная область. C++ позволяет явным образом задать область определения имен как часть глобальной области с помощью оператора namespace. Область видимости совпадает с областью действия за исключением ситуации, когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он и входит в ее область действия. Тем не менее к этой переменной, если она глобальная, можно обратиться, используя операцию доступа к области видимости::. Способ обратиться к скрытой локальной переменной отсутствует.

В каждой области действия различают так называемые пространства имен. Пространство имен — область, в пределах которой идентификатор должен быть уникальным. В разных пространствах имена могут совпадать, поскольку разрешение ссылок осуществляется по контексту идентификатора в программе, например:

struct Nocle{1nt Node;

int 1;

}Nocle:

В данном случае противоречия нет, поскольку имена типа, переменной и элемента структуры относятся к разным пространствам. В C++ определено четыре раздельных класса идентификаторов, в пределах каждого из которых имена должны быть уникальными.

• К одному пространству имен относятся имена переменных, функций, типов, определенных пользователем (typedef) и констант перечислений (с. 66) в пределах одной области видимости. Все они, кроме имен функций, могут быть переопределены во вложенных блоках.

• Другой класс имен образуют имена типов перечислений, структур, классов и объединений. Каждое имя должно отличаться от имен других типов в той же области видимости.

• Отдельный класс составляют элементы каждой структуры, класса и объединения. Имя элемента должно быть уникально внутри структуры, но может совпадать с именами элементов других структур.

• Метки образуют отдельное пространство имен.

Атрибуты компоновки имен.

Имя в файловой области видимости, не описанное явно как static, является общим для каждого файла многофайловой программы. Таковым же является имя функции. О таких именах говорится, что они внешние. Каждое описание внешнего имени в программе относится к тому же объекту, функции, классу, перечислении или значению перечислителя. Типы, специфицированные во всех описаниях внешнего имени должны быть идентичны. Может быть больше одного определения типа, перечисления, inline-функции или несоставного const, при условии, что определения идентичны, появляются в разных файлах и все инициализаторы являются константными выражениями. Во всех остальных случаях должно быть ровно одно определение для внешнего имени в программе.

Структура программы

Программа на языке C++ состоит из функций описаний и директив препроцессора (с. 16). Одна из функций должна иметь имя main. Выполнение программы начинается с первого оператора этой функции. Простейшее определение функции имеет следующий формат:

тип_возвращаемого_значения имя ([ параметры ]){операторы, составляющие тело функции}

Как правило, функция используется для вычисления какого-либо значения, поэтому перед именем функции указывается его тип. О функциях рассказывается на с. 73, ниже приведены лишь самые необходимые сведения:

• если функция не должна возвращать значение, указывается тип void:

• тело функции является блоком и, следовательно, заключается в фигурные

скобки;

• функции не могут быть вложенными;

• каждый оператор заканчивается точкой с запятой (кроме составного оператора).

Пример структуры программы, содержащей функции main, fl и f2:

директивы препроцессора

описания

int ma1n(){

операторы главной функции

int fl(){

операторы функции f l}.

int f2(){

операторы функции f2

}

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

Основные функции ввода/вывода в стиле С:

int scanf (const char* format....) // ввод

int printf(const char* format....) // вывод

Они выполняют форматированный ввод и вывод произвольного количества величин в соответствии со строкой формата format. Строка формата содержит символы, которые при выводе копируются в поток (на экран) или запрашиваются из потока (с клавиатуры) при вводе, и спецификации преобразования, начинающиеся со знака %, которые при вводе и выводе заменяются конкретными величинами. Список наиболее употребительных спецификаций преобразования приведен в приложении 2.

Пример программы, использующей функции ввода/вывода в стиле С:

#1nclude <std1o.h>

1nt main(){

int 1:

printf("Введите целое число\п"):

scafifC'^d". &1):

printf("Вы ввели число ^d. спасибо!", i):

return 0:

}

Первая строка этой программы — директива препроцессора, по которой в текст программы вставляется заголовочный файл <stdio.h>, содержащий описание использованных в программе функций ввода/вывода (в данном случае угловые скобки являются элементом языка). Все директивы препроцессора начинаются

со знака #. Директивы препроцессора описаны на с. 93. Третья строка — описание переменной целого типа с именем i. Переменные рассматриваются на с. 28.

Функция printf в четвертой строке выводит приглашение «Введите целое число» и переходит на новую строку в соответствии с управляющей последовательностью \п. Функция scanf заносит введенное с клавиатуры целое число в переменную 1 (знак & означает операцию получения адреса), а следующий оператор выводит на экран указанную в нем строку, заменив спецификацию преобразования на значение этого числа. Ввод/вывод в стиле С рассмотрен в разделе «Функции ввода/вывода» (с. 88).

А вот как выглядит та же программа с использованием библиотеки классов C++:

#include <1ostream.h>

int main(){

1nt 1:

cout «"Введите целое число\п":

cin» 1:

cout «"Вы ввели число " «1 «". спасибо!":

return 0;

}

Заголовочный файл <1 ostream. h> содержит описание набора классов для управления вводом/вывод:.;. В нем определены стандартные объекты-потоки с1п для ввода с клавиатуры и cout для вывода на экран, а также операции помещения в поток «и чтения из потока». Потоки рассмотрены в разделе «Потоковые классы

» на с. 265. В дальнейшем изложении будут использоваться оба способа, но в одной программе

смешивать их не рекомендуется.

Представление данных

Конкретные переменные типа «класс» называются экземплярами класса, или объектами. Объект – размещенный в оперативной памяти экземпляр данного типа. Все объекты в динамической памяти безымянны.

Время жизни и видимость объектов зависит от вида и места их описания и подчиняется общим правилам С++:

monstr Vasia: // Объект класса monstr с параметрами по умолчанию

monstr Super(200. 300): // Объект с явной инициализацией

monstr stado[100]: // Массив объектов с параметрами по умолчанию

monstr *beavis = new monstr (10): // Динамический объект

//(второй параметр задается по умолчанию)

monstr &butthead = Vasia: // Ссылка на объект

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

int n = Vasid.get_ammo();

stado[5].draw;

cout «beavis->get_health();

Обратиться таким образом можно только к элементам со спецификаторам рublic. Получить или изменить значения элементов со спецификатором private можно только через обращение к соответствующим методам (Спецификаторы доступа private и рubliс управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Интерфейс класса описывается после спецификатора public. Действие любого спецификатора распространяется до следующего спецификатора или до конца класса.) Можно создать константный объект, значения полей которого изменять запрещается.

К нему должны применяться только константные методы:

class monstr{

int get_health() const {return health;}

}:

const monstr Dead(Q,0); // Константный объект

cout «Dead.get_health();

Константный метод:

• объявляется с ключевым словом const после списка параметров;

а не может изменять значения полей класса;

• может вызывать только константные методы;

• может вызываться для любых (не только константных) объектов.

Рекомендуется описывать как константные те методы, которые предназначены для получения значений полей.

Имена типов данных.

Имена типов данных - это объявление объектов такого типа, в котором опущено имя самого такого объекта.

С типом связаны: формат размещения в памяти и набор допустимых операций.

Концепция типа данных

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

Тип данных определяет:

• внутреннее представление данных в памяти компьютера;

• множество значений, которые могут принимать величины этого типа;

• операции и функции, которые можно применять к величинам этого тина.

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

Все типы языка С++ можно разделить на простые (скалярные), составные (агрегатные) и функциональные. Простые типы могут быть стандартными и определенными программистом.

Встроенные и составные типы данных.

Все типы языка C++ можно разделить на основные и составные. В языке C++ определено шесть основных типов данных для представления целых, вещественных, символьных и логических величин. На основе этих типов программист может вводить описание составных типов. К ним относятся массивы, перечисления, функции, структуры, ссылки, указатели, объединения и классы.

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

1nt *(*р[10])();

объявляется массив из 10 указателей на функции без параметров, возвращающих указатели на int.

Основные {стандартные) типы данных часто называют арифметическими, поскольку их можно использовать в арифметических операциях. Для описания основных типов определены следующие ключевые слова:

• int (целый);

• char (символьный);

• wchar_t (расширенный символьный);

• bool (логический);

• float (вещественный);

• double (вещественный с двойной точностью).

Первые четыре тина называют целочисленными {целыми), последние два — типами с плавающей точкой. Код, который формирует компилятор для обработки целых величин, отличается от кода для величин с плавающей точкой.

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

• short (короткий);

• long (длинный);

• signed (знаковый);

• unsigned (беззнаковый).

Таблица 1 - Основные типы

Тип bool signed char unsigned char signed short int unsigned short int signed long int unsigned long int float double long double   Диапазон значений true и false -128... 127 0... 255 -32 768... 32 767 0... 65 535 -2 147 483 648... 2 147 483 647 0... 4 294 967 295 3.4e-38... 3.4e+38 1.7e-308... 1.7C+308 3.4e-4932... 3.4e+4932   Размер (байт)

Квалификатор const.

Модификатор const показывает, что значение переменной изменять нельзя. Такую переменную называют именованной константой, или просто константой.

Переменная, к которой в объявлении применен квалификатор const, не может изменять свое значение. Ее можно только инициализировать, то есть присвоить ей значение в начале выполнения программы. Компилятор может поместить переменную этого типа в постоянное запоминающее устройство. Например, в объявлении

const int a=10;

создается переменная с именем а, причем ей присваивается начальное значение 10, которое в дальнейшем в программе изменить никак нельзя. Переменную, к которой в объявлении применен квалификатор const, можно использовать в различных выражениях. Однако свое значение она может получить только в результате инициализации или с помощью аппаратно-зависимых средств.Квалификатор const часто используется для того, чтобы предотвратить изменение функцией объекта, на который указывает аргумент функции. Без него при передаче в функцию указателя эта функция может изменить объект, на который он указывает. Однако если в объявлении параметра-указателя применен квалификатор const, функция не сможет изменить этот объект.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...