[БЕЗ_ЗВУКА] В
предыдущем видео мы с вами познакомились с константными ссылками.
При этом мы узнали, что константные ссылки получаются из обычных
ссылок приписыванием ключевого слова const.
Так вот, давайте в этом видео более подробно познакомимся
с вот этим самым ключевым словом const и узнаем, что оно позволяет делать.
На самом деле const в C++ — это специальный модификатор типа,
который запрещает изменение объектов этого типа, переменных этого типа.
Ну давайте рассмотрим примеры.
Начнем с простого.
Объявим переменную x, присвоим ей 5 и попробуем,
значит, сделать с ней некоторые изменения.
Ну, для начала запишем в нее 6, потом прибавим еще
4 и выведем значение x.
Скомпилируем нашу программу.
Она компилируется и выводит 10.
Хорошо.
Теперь давайте добавим к типу переменной x
ключевое слово const и скомпилируем нашу программу.
Она не компилируется.
И видите, Eclipse подчеркивает сразу две строчки.
Он показывает: вот у нас есть тут сообщения об ошибках,
в которых написано, что у нас происходит
присваивание к переменной x, которая read-only, то есть ее нельзя изменять.
Ну и вот если мы на них два раза кликнем, то видно,
что это как раз таки в строчках 8 и 9, где мы действительно меняем переменную x.
Давайте их закомментируем и снова попробуем скомпилировать нашу программу.
Она компилируется и работает, выводит 5.
Ну потому что вывод переменной x — это ее чтение,
соответственно мы никак ее не изменяем, и поэтому модификатор const
разрешает нам из нее читать, потому что это не модифицирующая операция.
Давайте посмотрим другой пример.
Давайте объявим переменную s типа string,
введем, проинициализируем ее каким-нибудь словом,
ну например, hello и что сделаем?
Выведем ее размер, s.size.
Допишем к
ней какую-то еще строчку, в данном случае world,
объявим переменную t типа string и скажем,
что она равна s + "!", ну и наконец выведем s.
Скомпилируем нашу программу, она должна компилироваться.
Да, она компилируется, работает, и мы видим,
что она выводит 5 — это размер нашей строки s — hello,
5 букв, и выводит hello world, потому что мы к s приписали world.
Снова давайте добавим модификатор const к объявлению s.
Компилируем программу и что мы видим?
Мы видим, что в девятой строке у нас ошибка,
потому что мы пытаемся изменить строку s, приписать к ней что-то.
При этом у нас отлично скомпилировалась восьмая строка, где мы читаем размер
строки — ну потому что мы читаем размер, мы никак не меняем саму строку.
И у нас скомпилировалась десятая строка,
где мы выполняем присваивание переменной t, потому что мы просто прибавляем к
строке s восклицательный знак и записываем это в другую переменную.
Опять же мы просто читаем из строки s, но никак ее не изменяем.
Поэтому, если мы закомментируем
модификацию строки s и скомпилируем нашу программу,
она скомпилируется, будет работать и выведет 5 и hello, потому что...
Теперь она выводит hello, потому что это первоначальная строка,
которую мы записали в переменную s.
И давайте рассмотрим еще один пример.
Давайте объявим вектор строк,
назовем его w и запишем в этот вектор строк только одно слово — hello.
И захотим сделать следующее: мы захотим у этого
слова hello поменять первую букву на большую букву H.
Мы напишем w(0) — это мы обратились к первой строке.
Снова (0) — это мы уже берем первый символ нашей первой
строки и записываем туда H> Давайте выведем его,
чтобы убедиться, что у нас все сделано правильно.
Компилируем запускаем и да,
мы вывели только первый символ, а хочется вывести всю строчку.
Запускаем и да, мы видим Hello с большой буквы.
Теперь давайте возьмем наш вектор string, объявим его константным вектором строк.
Скомпилируем нашу программу.
Она не компилируется.
И не компилируется она в том месте, где мы меняем первый символ нашей строки.
Смотрите, что получилось.
Мы сказали, что константный у нас вектор.
что нельзя этот вектор изменять.
Но мы его никак не изменяем: мы не меняем его размер, мы не делаем ему push back.
Мы берем первый элемент, строчку и что-то с ней делаем.
То есть вроде как строчка, она не относится к вектору.
Но в C++ модификатор const распространяется и на элементы контейнера.
То есть когда мы говорим, что у нас константный вектор строк, это значит,
что и вектор нельзя изменять, то есть вот давайте я прямо продемонстрирую,
что в него нельзя сделать push back.
Вот я сейчас скомпилирую программу, вот push back тоже не компилируется.
Вектор нельзя изменять, но нельзя изменять и элементы,
которые хранятся в этом векторе, как демонстрирует этот наш пример.
То есть только если я закомментирую модификацию первого символа первой
строки вектора w, то наша программа скомпилируется.
Зачем вообще в C++ нужен модификатор const?
Его главная функция — это помощь программисту,
предотвращение ошибок, которые связаны со случайной модификацией переменных.
Как видите, если мы не хотим изменять какие-то объекты,
какие-то переменные, мы можем пометить их ключевым словом const,
и тогда компилятор предупредит нас, если мы вдруг случайно решили...
ну если мы случайно вдруг меняем значение этой переменной.
Поэтому ключевое слово const, оно, так сказать,
на страже ваших программ и очень часто помогает оградить вас от ненужных ошибок,
сэкономить время на написание кода и избавить вас от мучительных часов отладки.
Давайте подведем итоги.
В этом видео мы узнали, что const — это специальный модификатор типа, который
запрещает изменять переменные этого типа, объявленные с ключевым словом const.
И собственно, это основная,
основное назначение — это защита от случайного изменения переменных.