Программирование >>  Структурное программирование 

1 ... 154 155 156 [ 157 ] 158 159 160 ... 342


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



1 ... 154 155 156 [ 157 ] 158 159 160 ... 342

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика