Чтение онлайн

на главную - закладки

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

Если указатель на объект объявлен константным, он может использоваться для вызова только тех методов, которые также объявлены со спецификатором const (листинг 8.10).

Листинг 8.10. Указатели на константные объекты

1: // Листинг 8.10.

2: // Вызов константных методов с помощью указателей

3:

4: flinclude <iostream.h>

5:

6: class Rectangle

7: {

8: public:

9: Rectangle;

10: ~Rectangle;

11: void SetLength(int length) { itsLength = length; }

12: int GetLength const { return itsLength; }

13: void SetWidth(int width) { itsWidth = width: }

14: int GetWidth const { return itsWidth; }

15:

16: private:

17: int itsLength;

18: int itsWidth;

19: };

20:

21: Rectangle::Rectangle

22: {

23: itsWidth = 5;

24: itsLength = 10;

25: }

26:

27: Rectangle::~Rectangle

28: { }

29:

30: int main

31: {

32: Rectangle* pRect = new Rectangle;

33: const Rectangle * pConstRect = new Rectangle;

34: Rectangle * const pConstPtr = new Rectangle;

35:

36: cout << "pRect width; " << pRect->GetWidth << " meters\n";

37: cout << "pConstRect width: " << pConstRect-> GetWidth << " meters\n";

38: cout << "pConstPtr width: " << pConstPtr-> GetWidth << " meters\n";

39:

40: pRect->SetWidth(10);

41: // pConstRect->SetWidth(10);

42: pConstPt r->SetWidth(10); 43:

44: cout << "pRect width: " << pRect->GetWidth << " meters\n";

45: cout << "pConstRect width:"<< pConstRect->GetWidth << " meters\n";

46: cout << "pConstPtr width: " << pConstPtr->GetWidth << " meters\n";

47: return 0;

48: }

Результат:

pRect width: 5 meters

pConstRect width: 5 meters

pConstPtr width: 5 meters

pRect width: 10 meters

pConstRect width: 5 meters

pConstPtr width: 10 meters

Анализ:

В строках 6—19 приведено описание класса Rectangle. Обратите внимание, что метод GetWidth, описанный в строке 14, имеет спецификатор const. Затем в строке 32 объявляется указатель на объект класса Rectangle, а в строке 33 — на константный объект этого же класса. Константный указатель pConstPrt описывается в строке 34.

В строках 36—38 значения переменных класса выводятся на экран.

Метод SetWidth, вызванный для указателя pRect (строка 40), устанавливает значение ширины объекта. В строке 41 показан пример использования указателя pConstRect для вызова метода класса. Но, так как pConstRect является указателем на константный объект, вызов методов без спецификатора const для него недоступен, поэтому данная строка закомментирована.

В строке 42 происходит вызов метода SetWidth для указателя pConstPrt. Этот указатель константный и может ссылаться только на одну область памяти, однако сам объект константным не является, поэтому данная операция полностью корректна.

Рекомендуется:Проверяйте значения, возвращаемые

функцией malloc.

Защищайте объекты, которые не должны изменяться в программе, с помощью ключевого слова const в случае передачи их как ссылок.

Передавайте как ссылки те объекты, которые должны изменяться в программе. Передавайте как значения небольшие объекты, которые не должны изменяться в программе.

Указатель const this

После объявлении константного объекта указатель this также будет использоваться как константный. Следует отметить, что использование указателя const this допускается только в методах, объявленных со спецификатором const.

Более подробно этот вопрос рассматривается на следующем занятии при изучении ссылок на константные объекты.

Вычисления с указателями

Один указатель можно вычитать из другого. Если, например, два указателя ссылаются на разные элементы массива, вычитание одного указателя из другого позволяет получить количество элементов массива, находящихся между двумя заданными. Наиболее эффективно эта методика используется при обработке символьных массивов (листинг 8.11).

Листинг 8.11. Выделение слов из массива символов

1: #include <iostream.h>

2: #include <ctype.h>

3: #include <string.h>

4: bool GetWord(char* string, char* word, int& wordOffset);

5: // основная программа

6: int main

7: {

8: const int bufferSize = 255;

9: char buffer[bufferSize+1]; // переменная для хранения всей строки

10: char word[bufferSize+1]; // переменная для хранения слова

11: int wordOffset = 0; // начинаем с первого символа

12:

13: cout << "Enter а string: ";

14: cin.getline(buffer,bufferSize);

15:

16: while (GetWord(buffer,word,wordOffset))

17: {

18: cout << "Got this word: " << word << endl;

19: }

20:

21: return 0;

22:

23: }

24:

25:

26: // Функция для выделения слова из строки символов.

27: bool GetWord(char* string, char* word, int& wordOffset)

28: {

29:

30: if (!string[wordOffset]) // определяет конец строки?

31: return false;

Поделиться:
Популярные книги

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Студиозус

Шмаков Алексей Семенович
3. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Пограничная река. (Тетралогия)

Каменистый Артем
Пограничная река
Фантастика:
фэнтези
боевая фантастика
9.13
рейтинг книги
Пограничная река. (Тетралогия)

Брак по-драконьи

Ардова Алиса
Фантастика:
фэнтези
8.60
рейтинг книги
Брак по-драконьи

Страж Кодекса. Книга III

Романов Илья Николаевич
3. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Страж Кодекса. Книга III

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Найдёныш. Книга 2

Гуминский Валерий Михайлович
Найденыш
Фантастика:
альтернативная история
4.25
рейтинг книги
Найдёныш. Книга 2

Довлатов. Сонный лекарь 3

Голд Джон
3. Не вывожу
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь 3

В зоне особого внимания

Иванов Дмитрий
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
В зоне особого внимания

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7

Идеальный мир для Лекаря 4

Сапфир Олег
4. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 4

Барон устанавливает правила

Ренгач Евгений
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Барон устанавливает правила

Пустоцвет

Зика Натаэль
Любовные романы:
современные любовные романы
7.73
рейтинг книги
Пустоцвет