Cтраница 2
![]() |
Использование класса Time с константными объектами и константными функциями-элементами ( часть 1 из 3. [16] |
Объявляйте как const все функции-элементы, которые предполагается использовать с константными объектами. [17]
Более подробно этот вопрос рассматривается на следующем занятии при изучении ссылок на константные объекты. [18]
Функция GetFirstNameO возвращает константную строку и вы не можете использовать operateг с константным объектом. [19]
Теперь вы научились для безопасной передачи значений между функциями использовать константные указатели на константные объекты или константные ссылки, благодаря чему достигается как эффективность, так и безопасность работы программы. [20]
Программисты, работающие с языком C, обычно не видят разницы между константной ссылкой на объект SimpleCat и ссылкой на константный объект SimpleCat. Сами ссылки нельзя переназначать, чтобы они ссылались на другой объект, поэтому они всегда константны. Если к ссылке применено ключевое слово const, то это делает константным объект, с которым связана ссылка. [21]
Адрес этого обычного объекта передается функции FunctionTwoO, но, поскольку в объявлении функции FunctionTwoO заявлено, что передаваемый указатель должен быть константным указателем на константный объект, с этим объектом функция обращается так, как если бы он был константным. [22]
Здесь возникает интересная проблема для конструкторов и деструкторов, которые обычно должны изменять объект. Для конструкторов и деструкторов константных объектов объявление const не требуется. Конструктор должен иметь возможность изменять объект с целью присваивания ему соответствующих начальных значений. Деструктор должен иметь возможность выполнять подготовку завершения работ перед уничтожением объекта. [23]
![]() |
Использование класса Time с константными объектами и константными элементами-функциями ( часть 1 из 3. [24] |
Здесь возникает интересная проблема в связи с конструкторами и деструкторами, каждый из которых, несомненно, изменяет объекты. Для конструкторов и деструкторов константных объектов объявлений с модификатором const не требуется. Конструктору должно быть разрешено изменять объект, с тем чтобы этот объект мог быть надлежащим образом инициализирован. Деструктор должен иметь возможность выполнять свою заключительную приборку до разрушения объекта. [25]
Константный объект нельзя изменить с помощью присваивания, поэтому он должен быть инициализирован. Если элемент данных является константным объектом, то для того, чтобы конструктор мог установить начальные значения для этого объекта, должен использоваться инициализатор элемента. [26]
В этой программе функция FunctionOne не используется, но вызывается функция FunctionTwoO, которая слегка изменена. На этот раз и параметр, и значение возврата объявляются как константные указатели на константные объекты. [27]
Это жестоко, поскольку клиенты объектов возможно захотят использовать различные функции-элементы чтения get, а они, конечно, не изменяют объект. Чтобы обойти это, программист может объявить константные функции-элементы; только они могут оперировать константными объектами. Конечно, константные функции-элементы не могут изменять объект - это не позволит компилятор. [28]
Это жесткое ограничение, поскольку клиенты объекта, возможно, захотят использовать с этим объектом различные geU - функции. Чтобы предоставить клиентам такую возможность, программист может объявить константные элементы-функции; только эти функции могут оперировать с константными объектами. Разумеется, константные функции-элементы не могут модифицировать объект. [29]
В этом случае не допускается присвоение данному указателю нового адреса. Указатель, хранящий адрес константного объекта, не может использоваться для изменения этого объекта. [30]