Ссылочные типы данных и их применение 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Ссылочные типы данных и их применение



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

Ссылочный тип обозначается указанием оператора взятия адреса (&) перед именем переменной.

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

int ival = 1024;

// правильно: refVal - ссылка на ival

int &refVal = ival;

// ошибка: ссылка должна быть инициализирована

int &refVal2;

 

Указатели предназначены для хранения адресов областей памяти, а cсылка представляет собой синоним имени, указанного при инициализации ссылки.

26. Указатели в языке C++. Доступ к данным по указателю

Каждая переменная, которую вы объявляете в программе, имеет адрес – номер ячейки памяти, в которой она расположена. Адрес является неотъемлемой характеристикой переменной. Можно объявить другую переменную, которая будет хранить этот адрес и которая называется указателем. Указатели применяются при передаче в функцию параметров, которые мы хотим изменить, при работе с массивами, при работе с динамической памятью и в ряде других случаев.

Объявление указателя имеет следующий синтаксис:

<тип> *<идентификатор> [ = <инициализатор>];

Существуют две операции, которые имеют отношение к работе с указателями. Этими операциями являются:

· операция взятия адреса (адресация) &;

· операция взятия значения по адресу (косвенная адресация или разыменование) *.

int a, *p;

p = &a; // Переменной p присваивается адрес переменной a

*p = 0; // Значение по адресу, находящемуся в переменной p (т.е. значение переменной а), становится равным 0

Структурный тип данных

Для определения структурного типа используется ключевое слово struct:

struct имя_структурного_типа

{

описание поля1;

...

описание поляn;

}

При определении структурной переменной язык C++ резервирует для нее место в памяти. Если же был описан только структурный тип, а ни одной переменной данного типа определено не было, то место в памяти не выделяется.

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

Доступ к значениям полей структурного типа осуществляется с помощью операции точка.

28. Массивы в языке C++. Связь массивов и указателей

В Си существует связь между указателями и массивами, и связь эта настолько тесная, что эти средства лучше рассматривать вместе. Любой доступ к элементу массива, осуществляемый операцией индексирования, может быть выполнен с помощью указателя.

Объявление int a[10] определяет массив a размера 10, т. е. блок из 10 последовательных объектов с именами a[0], a[1],..., a[9].

Между индексированием и арифметикой с указателями существует очень тесная связь. По определению значение переменной или выражения типа массив есть адрес нулевого элемента массива. После присваивания

pa = &a[0];

ра и a имеют одно и то же значение. Поскольку имя массива является синонимом расположения его начального элемента, присваивание pa=&a[0] можно также записать в следующем виде:

pa = a;

Кроме того, a[i] можно записать как *(a+i). Компилятор автоматически приводит запись первого вида ко второму.

Многомерные массивы

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

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

int MyArray[3][3][3] = {

{{0, 1}},

{{100}, {200, 210}, {300}},

{{1000}, {2000, 2100}, {3000, 3100, 3200}}

};

 

MyArray[0][0][0] == 0MyArray[0][0][1] == 1MyArray[1][0][0] == 100MyArray[1][1][0] == 200MyArray[1][1][1] == 210MyArray[1][2][0] == 300MyArray[2][0][0] == 1000MyArray[2][1][0] == 2000MyArray[2][1][1] == 2100MyArray[2][2][0] == 3000MyArray[2][2][1] == 3100MyArray[2][2][2] == 3200

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

Строки и массивы символов

Символ – элементарная единица, некоторый набор которых несет определенный смысл. В языке программирования С++ предусмотрено использование символьных констант. Символьная константа – это целочисленное значение (типа int) представленное в виде символа, заключённого в одинарные кавычки, например 'a'. В таблице ASCII представлены символы и их целочисленные значения.

Строки в С++ представляются как массивы элементов типа char, заканчивающиеся нуль-терминатором \0 называются С строками или строками в стиле С. \0 — символ нуль-терминатора.

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

При объявлении строки не обязательно указывать её размер, но при этом обязательно нужно её инициализировать начальным значением. Тогда размер строки определится автоматически и в конец строки добавится нуль-терминатор.

Файлы и потоки

Для осуществления операций с файлами предусмотрено три класса: ifstream, ofstream и fstream. Эти классы являются производными, соответственно, от классов istream, ostream и iostream. Поскольку эти последние классы, в свою очередь, являются производными от класса ios, классы файловых потоков наследуют все функциональные возможности своих родителей (перегруженные операции << и >> для встроенных типов, функции и флаги форматирования, манипуляторы и пр.). Для реализации файлового ввода-вывода нужно включить в программу заголовочный файл fstream.h.

Чтобы открыть файл для ввода или вывода, можно использовать вторую форму нужного конструктора

fstream fs("FileName.dat");

Завершив операции ввода-вывода, необходимо закрыть файл, вызвав функцию-член close() с прототипом void close():

ofs.close();

Закрытие файла происходит автоматически при выходе потокового объекта из области существования, когда вызывается деструктор потока.



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 594; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.156.140 (0.009 с.)