SlideShare a Scribd company logo
1 of 9
Download to read offline
Программирование на языке C++
Лекция 3
Константность
Александр Смаль
1/9
Определение констант
∙ Ключевое слово const позволяет определять
типизированные константы.
double const pi = 3.1415926535;
int const day_seconds = 24 * 60 * 60;
// массив констант
int const days [12] = {31, 28, 31,
30, 31, 30,
31, 31, 30,
31, 30, 31};
∙ Попытка изменить константные данные приводит к
неопределённому поведению.
int * may = (int *) &days [4];
*may = 30;
2/9
Указатели и const
В C++ можно определить как константный указатель, так и
указатель на константу:
int a = 10;
const int * p1 = &a; // указатель на константу
int const * p2 = &a; // указатель на константу
*p1 = 20; // ошибка
p2 = 0; // ОК
int * const p3 = &a; // константный указатель
*p3 = 30; // OK
p3 = 0; // ошибка
// константный указатель на константу
int const * const p4 = &a;
*p4 = 30; // ошибка
p4 = 0; // ошибка
3/9
Указатели и const
Можно использовать следующее правило:
“слово const делает неизменяемым тип слева от него”.
int a = 10;
int * p = &a;
// указатель на указатель на const int
int const ** p1 = &p;
// указатель на константный указатель на int
int * const * p2 = &p;
// константный указатель на указатель на int
int ** const p3 = &p;
4/9
Ссылки и const
∙ Ссылка сама по себе является неизменяемой.
int a = 10;
int & const b = a; // ошибка
int const & c = a; // ссылка на константу
∙ Использование константных ссылок позволяет избежать
копирования объектов при передаче в функцию.
Point midpoint(Segment const & s);
∙ По константной ссылке можно передавать rvalue.
Point p = midpoint(Segment(Point (0,0),
Point (1 ,1)));
5/9
Константные методы
∙ Методы классов могут быть объявлены как const.
struct IntArray {
size_t size () const;
};
∙ Такие методы не могут менять поля объекта
(тип this — указатель на const).
∙ У константных объектов (через указатель или ссылку на
константу) можно вызывать только константные методы:
IntArray const * p = foo ();
p->resize (); // ошибка
∙ Внутри константных методов можно вызывать только
константные методы. 6/9
Две версии одного метода
∙ Слово const является частью сигнатуры метода.
size_t IntArray :: size () const {return size_ ;}
∙ Можно определить две версии одного метода:
struct IntArray {
int get(size_t i) const {
return data_[i];
}
int & get(size_t i) {
return data_[i];
}
private:
size_t size_;
int * data_;
};
7/9
Cинтаксическая и логическая константность
∙ Синтаксическая константность: константные методы не
могут менять поля (обеспечивается компилятором).
∙ Логическая константность — нельзя менять те данные,
которые определяют состояние объекта.
struct IntArray {
void foo() const {
// нарушение логической константности
data_ [10] = 1;
}
private:
size_t size_;
int * data_;
};
8/9
Ключевое слово mutable
Ключевое слово mutable позволяет определять поля, которые
можно изменять внутри константных методов:
struct IntArray {
size_t size () const {
++ counter_;
return size_;
}
private:
size_t size_;
int * data_;
mutable size_t counter_;
};
9/9

More Related Content

What's hot

6.4 Ещё о шаблонах
6.4 Ещё о шаблонах6.4 Ещё о шаблонах
6.4 Ещё о шаблонахDEVTYPE
 
3.5 Модификаторы доступа
3.5 Модификаторы доступа3.5 Модификаторы доступа
3.5 Модификаторы доступаDEVTYPE
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функцийDEVTYPE
 
[Youdz.ru] первообразная.
[Youdz.ru] первообразная.[Youdz.ru] первообразная.
[Youdz.ru] первообразная.You DZ
 
5.5 Ключевое слово friend
5.5 Ключевое слово friend5.5 Ключевое слово friend
5.5 Ключевое слово friendDEVTYPE
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторыDEVTYPE
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызововDEVTYPE
 
3.4 Объекты и классы
3.4 Объекты и классы3.4 Объекты и классы
3.4 Объекты и классыDEVTYPE
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторовDEVTYPE
 
3.7 Конструктор копирования и оператор присваивания
3.7 Конструктор копирования и оператор присваивания3.7 Конструктор копирования и оператор присваивания
3.7 Конструктор копирования и оператор присваиванияDEVTYPE
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методыDEVTYPE
 
Условный оператор
Условный операторУсловный оператор
Условный операторOlgaDask
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методовDEVTYPE
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 ПерегрузкаDEVTYPE
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 СтруктурыDEVTYPE
 
минимизация булевых функций
минимизация булевых функцийминимизация булевых функций
минимизация булевых функцийkuzinolga
 
2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-выводDEVTYPE
 
Pervoobraznaya i neopredelennyj_integral
Pervoobraznaya i neopredelennyj_integralPervoobraznaya i neopredelennyj_integral
Pervoobraznaya i neopredelennyj_integraldimonz9
 

What's hot (20)

6.4 Ещё о шаблонах
6.4 Ещё о шаблонах6.4 Ещё о шаблонах
6.4 Ещё о шаблонах
 
3.5 Модификаторы доступа
3.5 Модификаторы доступа3.5 Модификаторы доступа
3.5 Модификаторы доступа
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функций
 
[Youdz.ru] первообразная.
[Youdz.ru] первообразная.[Youdz.ru] первообразная.
[Youdz.ru] первообразная.
 
5.5 Ключевое слово friend
5.5 Ключевое слово friend5.5 Ключевое слово friend
5.5 Ключевое слово friend
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы
 
лекция 6
лекция 6лекция 6
лекция 6
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызовов
 
3.4 Объекты и классы
3.4 Объекты и классы3.4 Объекты и классы
3.4 Объекты и классы
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторов
 
3.7 Конструктор копирования и оператор присваивания
3.7 Конструктор копирования и оператор присваивания3.7 Конструктор копирования и оператор присваивания
3.7 Конструктор копирования и оператор присваивания
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методы
 
Условный оператор
Условный операторУсловный оператор
Условный оператор
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 Структуры
 
минимизация булевых функций
минимизация булевых функцийминимизация булевых функций
минимизация булевых функций
 
2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод
 
Pervoobraznaya i neopredelennyj_integral
Pervoobraznaya i neopredelennyj_integralPervoobraznaya i neopredelennyj_integral
Pervoobraznaya i neopredelennyj_integral
 

Viewers also liked

Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачиDEVTYPE
 
4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладкаDEVTYPE
 
2.7 Многомерные массивы
2.7 Многомерные массивы2.7 Многомерные массивы
2.7 Многомерные массивыDEVTYPE
 
4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программированиеDEVTYPE
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системеDEVTYPE
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 НаследованиеDEVTYPE
 
6. Generics. Collections. Streams
6. Generics. Collections. Streams6. Generics. Collections. Streams
6. Generics. Collections. StreamsDEVTYPE
 
6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классовDEVTYPE
 
1. Введение в Java
1. Введение в Java1. Введение в Java
1. Введение в JavaDEVTYPE
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателейDEVTYPE
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математикаDEVTYPE
 
2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 СсылкиDEVTYPE
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inlineDEVTYPE
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++DEVTYPE
 

Viewers also liked (14)

Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачи
 
4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка
 
2.7 Многомерные массивы
2.7 Многомерные массивы2.7 Многомерные массивы
2.7 Многомерные массивы
 
4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 Наследование
 
6. Generics. Collections. Streams
6. Generics. Collections. Streams6. Generics. Collections. Streams
6. Generics. Collections. Streams
 
6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классов
 
1. Введение в Java
1. Введение в Java1. Введение в Java
1. Введение в Java
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
 
2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 Ссылки
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++
 

Similar to 3.6 Константность

C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2Technopark
 
Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer ...
Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer ...Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer ...
Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer ...Iosif Itkin
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаAndrey Karpov
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarova
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Введение в синтаксис C++, часть 2
Введение в синтаксис C++, часть 2Введение в синтаксис C++, часть 2
Введение в синтаксис C++, часть 2DEVTYPE
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarova
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...
Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...
Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...Andrey Karpov
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIAlexey Paznikov
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаTatyanazaxarova
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноOpen-IT
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarova
 

Similar to 3.6 Константность (18)

C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2
 
Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer ...
Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer ...Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer ...
Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer ...
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Введение в синтаксис C++, часть 2
Введение в синтаксис C++, часть 2Введение в синтаксис C++, часть 2
Введение в синтаксис C++, часть 2
 
Step cpp022
Step cpp022Step cpp022
Step cpp022
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...
Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...
Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPI
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатно
 
Step cpp0201
Step cpp0201Step cpp0201
Step cpp0201
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
C# vs C++
C# vs C++C# vs C++
C# vs C++
 

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"
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
 
О-символика
О-символикаО-символика
О-символика
 

3.6 Константность

  • 1. Программирование на языке C++ Лекция 3 Константность Александр Смаль 1/9
  • 2. Определение констант ∙ Ключевое слово const позволяет определять типизированные константы. double const pi = 3.1415926535; int const day_seconds = 24 * 60 * 60; // массив констант int const days [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; ∙ Попытка изменить константные данные приводит к неопределённому поведению. int * may = (int *) &days [4]; *may = 30; 2/9
  • 3. Указатели и const В C++ можно определить как константный указатель, так и указатель на константу: int a = 10; const int * p1 = &a; // указатель на константу int const * p2 = &a; // указатель на константу *p1 = 20; // ошибка p2 = 0; // ОК int * const p3 = &a; // константный указатель *p3 = 30; // OK p3 = 0; // ошибка // константный указатель на константу int const * const p4 = &a; *p4 = 30; // ошибка p4 = 0; // ошибка 3/9
  • 4. Указатели и const Можно использовать следующее правило: “слово const делает неизменяемым тип слева от него”. int a = 10; int * p = &a; // указатель на указатель на const int int const ** p1 = &p; // указатель на константный указатель на int int * const * p2 = &p; // константный указатель на указатель на int int ** const p3 = &p; 4/9
  • 5. Ссылки и const ∙ Ссылка сама по себе является неизменяемой. int a = 10; int & const b = a; // ошибка int const & c = a; // ссылка на константу ∙ Использование константных ссылок позволяет избежать копирования объектов при передаче в функцию. Point midpoint(Segment const & s); ∙ По константной ссылке можно передавать rvalue. Point p = midpoint(Segment(Point (0,0), Point (1 ,1))); 5/9
  • 6. Константные методы ∙ Методы классов могут быть объявлены как const. struct IntArray { size_t size () const; }; ∙ Такие методы не могут менять поля объекта (тип this — указатель на const). ∙ У константных объектов (через указатель или ссылку на константу) можно вызывать только константные методы: IntArray const * p = foo (); p->resize (); // ошибка ∙ Внутри константных методов можно вызывать только константные методы. 6/9
  • 7. Две версии одного метода ∙ Слово const является частью сигнатуры метода. size_t IntArray :: size () const {return size_ ;} ∙ Можно определить две версии одного метода: struct IntArray { int get(size_t i) const { return data_[i]; } int & get(size_t i) { return data_[i]; } private: size_t size_; int * data_; }; 7/9
  • 8. Cинтаксическая и логическая константность ∙ Синтаксическая константность: константные методы не могут менять поля (обеспечивается компилятором). ∙ Логическая константность — нельзя менять те данные, которые определяют состояние объекта. struct IntArray { void foo() const { // нарушение логической константности data_ [10] = 1; } private: size_t size_; int * data_; }; 8/9
  • 9. Ключевое слово mutable Ключевое слово mutable позволяет определять поля, которые можно изменять внутри константных методов: struct IntArray { size_t size () const { ++ counter_; return size_; } private: size_t size_; int * data_; mutable size_t counter_; }; 9/9