![]() |
|
Программирование >> Структурное программирование
FIG7 1.CPP Попытка получить доступ к константному объекту с не-константными функциями-элементами. #include <iostream.h> #include times.h main ( ) const Time t(19, 33, 52) t.setHour(12); t.setMinute(20) t.setSecond(39) ОШИБКА ОШИБКА ОШИБКА константный объект не-константная функция элемент не-константная функция элемент не-константная функция элемент return 0; Compiling FIG7 1.CPP: Warning FIG7 1.CPP: Non-const function Time::setHour(int) called for const object Warning FXG7 l.CPP: Non-const function Time::setMinute(int) callers for const object Warning FIG7 l.CPP: Non-const function Time::setSecond(int) called for const object Рис. 7.1. Использование класса Time с константными объектами и константными функциями-элементами (часть 3 из 3) Типичная ошибка программирования 7.3 Вызов неконстантной функции-элемента для константного объекта. Типичная ошибка программирования 7.4 Попытка изменить константный объект. Замечание по технике программирования 7.2 Константная функция-элемент может бьпь перегружена неконстантным вариантом. Выбор того, какая из перегруженных функций-элементов будет использоваться, осу ществляется компилятором автоматически в зависимости от того, был объявлен объект как const или нет. Константный объект не может быть изменен с помощью присваивания, так что он должен получить начальное значение. Если данные-элементы класса объявлены как const, то надо использовать инициализатор элементов, чтобы обеспечить конструктор объекта этого класса начальными значением данных-элементов. Рис. 7.2 демонстрирует использование инициализатора элементов для задания начального значения константному элементу increment класса Increment. Конструктор для Increment изменяется следующим образом: FIG7 2.CPP Щ§ Использование инициализаторов элементов для инициализации данных константного встроенного типа, tinclude <iostream.h> class Increment { Ди public: Increment(int с = О, int i = 1); BiSi void addlncrement() { count += increment; } void print 0 const; private: int count; const int increment; константный элемент данных яИН Конструктор класса Increment щШ Increment: : Increment (int с, int i) ЩШ increment (i) инициализатор константного элемента ЩШ { count = с; } Печать данных void Increment: : print () const cout count = count , increment = increment << endl; fSt main () { Increment value{10, 5); cout << Перед приращением: ; value.print(); for (int j = 1; j <= 3; j++) { ЯК value . addlncrement {) ; cout После приращения j : ; value, print () ; return 0; Перед приргицением: count = 10, increment = 5 После приращения 1: count = 15, increment = 5 I После приращения 2: count = 20, increment = 5 После приргицения 3: count = 25, increment = 5 Рис. 7.2. Использование инициализаторов элементов для инициализации данных конаантного встроенного типа Increment :: Increment (int с, int i) : increment (i) { count = c; } Запись : increment (i) вызывает задание начального значения элемента increment, равного i. Если необходимо задать начальные значения сразу нескольким элементам, просто включите их в список после двоеточия, разделяя запятыми. Используя инициаторы элементов, можно присвоить начальные значения всем данным-элементам. Рис. 7.3. Ошибочная попытка задать начальное значение данным константного встроенного типа с помощью присваивания Рисунок 7.3 иллюстрирует ошибки компиляции, выдаваемые компилятором Borland С-Н- в программе, которая пытается задать начальное значение элементу increment, используя оператор присваивания, а не инициализатор элементов. FIG7 3.CPP Попытка инициализировать данные константного встроенного типа с помощью присваивания. #include <iostream.h> class Increment { public: Increment(int с = 0, int i = 1); void addlncrement() { count += increment; ) void print() const; private: int count; I const int increment; Конструктор класса Increment Increment:: Increment (int c, int i) { Константный элемент increment не получает начального значения count = с; increment = i; ОШИБКА: константный объект не может III быть изменен Печать данных void Increment::print() const cout count = << count , increment = increment endl; Щ main() Increment value(10, 5); cout Перед приращением: ; value.print(); for (int j = 1; j <= 3; j++) { value.addlncrement0; V- ; cout После приращения j : ; ; value .print () ; I } return 0; Compiling FIG7 3.CPP: Warning FIG7 3.CPP 18: Constant member increment is not initializatied Error FIG7 3.CPP 20: Cannot modify a const object I Warning FIG7 3.CPP 21: Parameter i is never used
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |