SlideShare a Scribd company logo
1 of 7
Download to read offline
Программирование на языке C++
Лекция 2
Ссылки
Александр Смаль
1/7
Недостатки указателей
∙ Использование указателей синтаксически загрязняет код и
усложняет его понимание. (Приходится использовать
операторы * и &.)
∙ Указатели могут быть неинициализированными
(некорректный код).
∙ Указатель может быть нулевым (корректный код), а
значит указатель нужно проверять на равенство нулю.
∙ Арифметика указателей может сделать из корректного
указателя некорректный (легко промахнуться).
2/7
Ссылки
∙ Для того, чтобы исправить некоторые недостатки
указателей, в C++ введены ссылки.
∙ Ссылки являются “красивой обёрткой” над указателями:
void swap (int & a, int & b) {
int t = b;
b = a;
a = t;
}
int main () {
int k = 10, m = 20;
swap (k, m);
cout << k << ’ ’ << m << endl; // 20 10
return 0;
}
3/7
Различия ссылок и указателей
∙ Ссылка не может быть неинициализированной.
int * p; // OK
int & l; // ошибка
∙ У ссылки нет нулевого значения.
int * p = 0; // OK
int & l = 0; // ошибка
∙ Ссылку нельзя переинициализировать.
int a = 10, b = 20;
int * p = &a; // p указывает на a
p = &b; // p указывает на b
int & l = a; // l ссылается на a
l = b; // a присваивается значение b
4/7
Различия ссылок и указателей
∙ Нельзя получить адрес ссылки или ссылку на ссылку.
int a = 10;
int * p = &a; // p указывает на a
int ** pp = &p;// pp указывает на переменную p
int & l = a; // l ссылается на a
int * pl = &l; // pl указывает на переменную a
int && ll = l; // ошибка
∙ Нельзя создавать массивы ссылок.
int * mp [10] = {}; // массив указателей на int
int & ml [10] = {}; // ошибка
∙ Для ссылок нет арифметики.
5/7
lvalue и rvalue
∙ Выражения в C++ можно разделить на два типа:
1. lvalue — выражения, значения которых являются ссылкой
на переменную/элемент массива, а значит могут быть
указаны слева от оператора =.
2. rvalue — выражения, значения которых являются
временными и не соответствуют никакой
переменной/элементу массива.
∙ Указатели и ссылки могут указывать только на lvalue.
int a = 10, b = 20;
int m[10] = {1,2,3,4,5,5,4,3,2,1};
int & l1 = a; // OK
int & l2 = a + b; // ошибка
int & l3 = *(m + a / 2); // OK
int & l4 = *(m + a / 2) + 1; // ошибка
int & l5 = (a + b > 10) ? a : b; // OK
6/7
Время жизни переменной
Следует следить за временем жизни переменных.
int * foo() {
int a = 10;
return &a;
}
int & bar() {
int b = 20;
return b;
}
int * p = foo ();
int & l = bar ();
7/7

More Related Content

Viewers also liked

6.3 Специализация шаблонов
6.3 Специализация шаблонов6.3 Специализация шаблонов
6.3 Специализация шаблоновDEVTYPE
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++DEVTYPE
 
3.8 Класс массива
3.8 Класс массива3.8 Класс массива
3.8 Класс массиваDEVTYPE
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 СтруктурыDEVTYPE
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математикаDEVTYPE
 
3.4 Объекты и классы
3.4 Объекты и классы3.4 Объекты и классы
3.4 Объекты и классыDEVTYPE
 
6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классовDEVTYPE
 
4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладкаDEVTYPE
 
2.7 Многомерные массивы
2.7 Многомерные массивы2.7 Многомерные массивы
2.7 Многомерные массивыDEVTYPE
 
2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-выводDEVTYPE
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 НаследованиеDEVTYPE
 
2.3 Указатели и массивы
2.3 Указатели и массивы2.3 Указатели и массивы
2.3 Указатели и массивыDEVTYPE
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 КонстантностьDEVTYPE
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторыDEVTYPE
 
Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачиDEVTYPE
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методыDEVTYPE
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в JavaDEVTYPE
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методовDEVTYPE
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 ПерегрузкаDEVTYPE
 
5.5 Ключевое слово friend
5.5 Ключевое слово friend5.5 Ключевое слово friend
5.5 Ключевое слово friendDEVTYPE
 

Viewers also liked (20)

6.3 Специализация шаблонов
6.3 Специализация шаблонов6.3 Специализация шаблонов
6.3 Специализация шаблонов
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++
 
3.8 Класс массива
3.8 Класс массива3.8 Класс массива
3.8 Класс массива
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 Структуры
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
 
3.4 Объекты и классы
3.4 Объекты и классы3.4 Объекты и классы
3.4 Объекты и классы
 
6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классов
 
4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка
 
2.7 Многомерные массивы
2.7 Многомерные массивы2.7 Многомерные массивы
2.7 Многомерные массивы
 
2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 Наследование
 
2.3 Указатели и массивы
2.3 Указатели и массивы2.3 Указатели и массивы
2.3 Указатели и массивы
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 Константность
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы
 
Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачи
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методы
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
5.5 Ключевое слово friend
5.5 Ключевое слово friend5.5 Ключевое слово friend
5.5 Ключевое слово friend
 

More from DEVTYPE

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреDEVTYPE
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойстваDEVTYPE
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистикаDEVTYPE
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространствоDEVTYPE
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform ContinuityDEVTYPE
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change ProblemDEVTYPE
 
Recurrences
RecurrencesRecurrences
RecurrencesDEVTYPE
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применениеDEVTYPE
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыDEVTYPE
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ DEVTYPE
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функцийDEVTYPE
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of FunctionsDEVTYPE
 
Кучи
КучиКучи
КучиDEVTYPE
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование ХаффманаDEVTYPE
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введениеDEVTYPE
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиDEVTYPE
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"DEVTYPE
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делительDEVTYPE
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа ФибоначчиDEVTYPE
 
О-символика
О-символикаО-символика
О-символикаDEVTYPE
 

More from DEVTYPE (20)

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
 
Recurrences
RecurrencesRecurrences
Recurrences
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
 
Кучи
КучиКучи
Кучи
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование Хаффмана
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
 
О-символика
О-символикаО-символика
О-символика
 

2.5 Ссылки

  • 1. Программирование на языке C++ Лекция 2 Ссылки Александр Смаль 1/7
  • 2. Недостатки указателей ∙ Использование указателей синтаксически загрязняет код и усложняет его понимание. (Приходится использовать операторы * и &.) ∙ Указатели могут быть неинициализированными (некорректный код). ∙ Указатель может быть нулевым (корректный код), а значит указатель нужно проверять на равенство нулю. ∙ Арифметика указателей может сделать из корректного указателя некорректный (легко промахнуться). 2/7
  • 3. Ссылки ∙ Для того, чтобы исправить некоторые недостатки указателей, в C++ введены ссылки. ∙ Ссылки являются “красивой обёрткой” над указателями: void swap (int & a, int & b) { int t = b; b = a; a = t; } int main () { int k = 10, m = 20; swap (k, m); cout << k << ’ ’ << m << endl; // 20 10 return 0; } 3/7
  • 4. Различия ссылок и указателей ∙ Ссылка не может быть неинициализированной. int * p; // OK int & l; // ошибка ∙ У ссылки нет нулевого значения. int * p = 0; // OK int & l = 0; // ошибка ∙ Ссылку нельзя переинициализировать. int a = 10, b = 20; int * p = &a; // p указывает на a p = &b; // p указывает на b int & l = a; // l ссылается на a l = b; // a присваивается значение b 4/7
  • 5. Различия ссылок и указателей ∙ Нельзя получить адрес ссылки или ссылку на ссылку. int a = 10; int * p = &a; // p указывает на a int ** pp = &p;// pp указывает на переменную p int & l = a; // l ссылается на a int * pl = &l; // pl указывает на переменную a int && ll = l; // ошибка ∙ Нельзя создавать массивы ссылок. int * mp [10] = {}; // массив указателей на int int & ml [10] = {}; // ошибка ∙ Для ссылок нет арифметики. 5/7
  • 6. lvalue и rvalue ∙ Выражения в C++ можно разделить на два типа: 1. lvalue — выражения, значения которых являются ссылкой на переменную/элемент массива, а значит могут быть указаны слева от оператора =. 2. rvalue — выражения, значения которых являются временными и не соответствуют никакой переменной/элементу массива. ∙ Указатели и ссылки могут указывать только на lvalue. int a = 10, b = 20; int m[10] = {1,2,3,4,5,5,4,3,2,1}; int & l1 = a; // OK int & l2 = a + b; // ошибка int & l3 = *(m + a / 2); // OK int & l4 = *(m + a / 2) + 1; // ошибка int & l5 = (a + b > 10) ? a : b; // OK 6/7
  • 7. Время жизни переменной Следует следить за временем жизни переменных. int * foo() { int a = 10; return &a; } int & bar() { int b = 20; return b; } int * p = foo (); int & l = bar (); 7/7