- •Алфавиты и типы данных. Целые и плавающие типы.
- •Выражение присваивания. Арифметические операции с целыми и плавающими переменными.
- •Логические операции, операции автоувеличения и автоуменьшения, тернарная операция.
- •Составной оператор. Условный оператор.
- •Оператор switch – case. Оператор безусловного перехода, break, continue.
- •Операторы цикла. Оператор безусловного перехода, break, continue.
- •Указатели. Указатели и массивы. Адресная арифметика.
- •Символьные массивы и строки. Указатели и многомерные массивы.
- •9. Операции для работы с динамической памятью.
- •10. Объявления и определения. Область существования имени.
- •11. Область видимости имён. Классы памяти.
- •12. Объявления объектов и типов. Синоним имени типа.
- •13. Правила преобразования стандартных типов. Неявные преобразования стандартных базовых типов. Преобразования производных стандартных типов.
- •14. Функции. Передача аргументов. Указатели на функции.
- •15. Ссылки. Передача аргументов в функции по ссылке.
- •16. Функции. Аргументы по умолчанию и переопределение функций.
- •17. Шаблоны функций.
- •Перечисления
- •Классы. Конструкторы и деструкторы.
- •Статические члены класса
- •Указатель this. Статические функции-члены.
- •Указатели на члены класса
- •Конструктор копирования и операция присваивания
- •Дружественные (привилегированные) функции
- •Производные классы. Построение. Защищенные классы. Производные классы Построение производного класса
- •Защищенные члены класса
- •Управление уровнем доступа к членам класса
- •19.4. Последовательность вызова конструктора и деструктора при построении производного класса на основе одного базового
- •Преобразования типов. Связь с наследованием. Преобразование типов
- •Раннее и позднее связывание (полиморфизм). Виртуальные функции. Полиморфизм
- •Раннее и позднее связывание
- •Виртуальные функции
15. Ссылки. Передача аргументов в функции по ссылке.
Тип "ссылка на тип" определяется так: тип&, например: int& или double&
Ссылочные типы устанавливают псевдонимы объектов. Ссылка обязательно должна быть инициализирована. После инициализации использование ссылки дает тот же результат, что и прямое использование переименованного объекта.
Рассмотрим инициализацию ссылки: int i=0; int& iref = i;
Здесь создана новая переменная типа ссылка на int с именем iref. Физически iref - это постоянный указатель на int и, следовательно, значение ссылки после инициализации не может быть изменено. Инициализирующим значением в нашем случае является адрес переменной i, т.е. при инициализации ссылка ведёт себя как указатель.
При использовании ссылка ведёт себя не как указатель, а как переменная, адресом которой она инициализирована:
iref ++; // то же, что и i++;
int *ip=&iref; // то же, что и ip=&i.
Итак, iref стало другим именем, псевдонимом переменной i.
Ссылку можно определить так: ссылка есть такой постоянный указатель на объект, к которому всегда при его использовании неявно применяется операция разрешения указателя *.
Если тип инициализированной ссылки не совпадает с типом объекта, создаётся новый анонимный объект, для которого ссылка является псевдонимом. Инициализатор преобразуется и его значение используется для установки значения анонимного объекта.
double d=0.0;
int& ir = d; // Создан анонимный объект типа int;
ir = 3.0; // d - не меняется!
Здесь создаётся анонимная переменная типа int, которая инициализируется значением, полученным в результате преобразования значения типа double к типу int. Затем ссылка инициализируется значением адреса этой переменной.
Анонимный объект создаётся также, когда инициализатор не является объектом, например, является константой: int& ir = 3; // Анонимный объект получил значение 3.
Здесь сначала создается анонимный объект типа int и он инициализируется значением 3. После этого создаётся ссылка ir и инициализируется адресом анонимного объекта. Теперь ir - его псевдоним и оператор
ir = 8; устанавливает новое значение этого анонимного объекта.
Ссылки часто используются в качестве формальных параметров функций. Механизм передачи параметров в функции с помощью ссылок называют в программировании передачей аргументов по ссылке. С помощью ссылок можно добиться изменения значений фактических параметров из вызывающей программы (без применения указателей).
void swap (int & x, int & y){
int t = x;
x = y;
y = t; }
Теперь обращение в вызывающей функции имеет вид:
int a = 3, b = 7;
swap (a, b);
Таким образом, создаются локальные относительно функции swap() переменные ссылочного типа, которые являются псевдонимами переменных a и b и инициализирующиеся переменными a, b. После этого все действия с x и y эквивалентны действиям с a и b, что приводит к изменению значений a и b.
Заметим, что в последнем примере можно обратиться к функции swap() и с аргументами, отличными по типу от int, и даже с аргументами, не являющимися объектами:
float a = 5, b = 2.7;
swap (a, b);
swap (3, a+b);
Однако в этих случаях функция swap() фактически никакого действия со своими аргументами не выполняет. Создаются временные объекты типа int, которые инициализируются значениями, полученными в результате преобразования a, b, a+b к типу int; затем ссылки x и y инициализируются значениями адресов этих анонимных объектов; анонимные объекты и будут изменены. Фактические параметры же останутся неизменными. Компилятор выдаст предупреждение, что он вынужден завести временные переменные, и будет работать с ними.