- •Управление esc – последовательность (с примерами)
- •4. Определение констант и их характеристика (const,define,enum)
- •5. Форматные потоки в с. Функции fPrintf(), Fscanf(), и модификации (с примерами). Спецификаторы
- •7. Перегруженные операции.
- •8. Инструкция ветвления. (пример)
- •9. Инструкция switch()
- •10. Применение инструкции switch() для создания текстового меню.
- •11. Инструкция цикла.
- •12. Инструкция перехода.
- •13. Указатели. Операции над указателями. Косвенная адресация.
- •14. Ссылки (пример)
- •15. Статические числовые одномерные
- •16. Статические числовые двумерные массивы.
- •17. Динамическая память.
- •18. Выделение памяти под динамический одномерный и двумерный массив.
- •19. Алгоритм удаления и добавления данных в массив.
- •20. Глобальные, локальные, статические, внешние переменные.
- •21. Классы памяти.
- •22. Формальные и фактические параметры.
- •23. Функции.
- •24. Виды передачи параметров в функцию.
- •25.Функции и массивы
- •26. Функции с переменным числом параметров.
- •27. Шаблоны функции.
- •28.Рекурсии. Фреймы.
- •29. Функция Main()
- •30. Стеки.
- •31. Очереди.
- •33. Строки, как массив символов.
- •34. Функции ввода строковых переменных.
- •35.Основные функции обработки строковых переменных.
- •37. Функции преобразования типов.
- •38. Строки типа string.
- •40. Функции работы с памятью. Memcmp - сравнивает две области памяти
- •41. Структуры
- •42. Вложенные структуры.
- •43. Объединения (union)
- •44.Передача переменных определенных пользователем в функцию.
- •50. Функция определения конца файла.
- •51. Файловый поток.
- •52. Функции tellg и ftell
- •53. Установка файлового указателя
- •55. Обработка текстовых файлов.
- •56. Бинарный файл.
14. Ссылки (пример)
В С(С++) известны три способа передачи данных в функцию: по значению, посредством указателя и используя ссылки.
При передаче параметров в функцию они помещаются в стековую память. В отличие от стандартных типов данных (char, int, float и др.) объекты обычно требуют много больше памяти, при этом стековая память может существенно увеличиться. Для уменьшения объема передаваемой через стек информации в С(С++) используются указатели. В языке С++ наряду с использованием механизма указателей имеется возможность использовать неявные указатели (ссылки). Ссылка, по существу, является не чем иным, как вторым именем некоторого объекта.
Формат объявления ссылки имеет вид:
тип & имя_ссылки = инициализатор.
Ссылку нельзя объявить без ее инициализации. То есть ссылка всегда должна ссылаться на некоторый, существующий объект. Можно выделить следующие отличия ссылок и указателей. Во-первых, невозможность существования нулевых ссылок подразумевает, что корректность их не требуется проверять. А при использовании указателя требуется проверять его на ненулевое значение. Во-вторых, указатели могут указывать на различные объекты, а ссылка всегда на один объект, заданный при ее инициализации. Ниже приведен пример использования ссылки.
{ A a("aaaaa",3),aa("bbbb",7);
A &b=a; // ссылка на объект класса А инициализирована значением а
cout <<"адрес a="<<&a << " адрес &b= "<< &b << endl;
b=aa; // присвоение значений объекта aa ссылке b (и объекту a)
cout<<"компоненты объекта :"; a.see();
cout<<"компоненты ссылки :"; b.see();
int &ii=i; // ссылка на переменную i типа int
Из примера следует, что переменная и ссылка на нее имеют один и тот же адрес в памяти. Изменение значения по ссылке приводит к изменению значения переменной и наоборот.
Ссылка может также указывать на константу, в этом случае создается временный объект, инициализируемый значением константы.
const int &j=4; // j инициализируется const-значением 4
j++; // ошибка l-value specifies const object
int k=j; // переменная k инициализируется значением
Если тип инициализатора не совпадает с типом ссылки, то могут возникнуть проблемы с преобразованием данных одного типа к другому, например:
double f=2.5;
int &n=(int &)f;
cout<<”f=”<<f<<” n=”<<n; // результат f= 2.5 n=2
Адрес переменной f и ссылки n совпадают, но значения различаются, так как структуры данных плавающего и целочисленного типов различны.
Можно создать ссылку на ссылку, например:
int k=1;
int &n=k; // n – ссылка на k (равно k)
n++; // значение k равно 2
int &nn=n; // nn – ссылка на ссылку n (переменную k)
nn++; // значение k равно 3
Значения адреса переменной k, ссылок n и nn совпадают, следовательно, для ссылки nn не создается временный объект.
На применение переменных ссылочного типа накладываются некоторые ограничения:
- ссылки не являются указателями;
- можно взять ссылку от переменной ссылочного типа;
- можно создать указатель на ссылку;
- нельзя создать массив ссылок;
- ссылки на битовые поля не допускаются.