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

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

Жанры

Освой самостоятельно С++ за 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;

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

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Капитан космического флота

Борчанинов Геннадий
2. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
рпг
5.00
рейтинг книги
Капитан космического флота

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Ветер и искры. Тетралогия

Пехов Алексей Юрьевич
Ветер и искры
Фантастика:
фэнтези
9.45
рейтинг книги
Ветер и искры. Тетралогия

Свадьба по приказу, или Моя непокорная княжна

Чернованова Валерия Михайловна
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Свадьба по приказу, или Моя непокорная княжна

Истинная со скидкой для дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Истинная со скидкой для дракона

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Золушка вне правил

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.83
рейтинг книги
Золушка вне правил

Измена. Мой заклятый дракон

Марлин Юлия
Любовные романы:
любовно-фантастические романы
7.50
рейтинг книги
Измена. Мой заклятый дракон

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1

Феномен

Поселягин Владимир Геннадьевич
2. Уникум
Фантастика:
боевая фантастика
6.50
рейтинг книги
Феномен

Имперский Курьер. Том 5

Бо Вова
5. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 5