Читайте также:
|
|
Константные объекты – это те, которые запрещено менять. Исполняющая система может размещать константные объекты в страницах физической памяти, защищенных от записи. В многозадачной системе, если запущено несколько одинаковых процессов, то страницы физической памяти, защищенные от записи, существуют в единственном экземпляре и разделяются всеми процессами, т.е. являются для них общими. Таким образом достигается существенная экономия памяти. Современный C и, конечно, C++ позволяет средствами языка разделить константные и не константные объекты.
Адрес константного объекта можно помещать лишь в указатель на константный объект. Проиллюстрируем на примере, как в C и C++ описывается указатель на константу:
const int *p;Описан указатель на константный объект типа int. Отметим, что сам указатель не является константой, ему можно присвоить значение.
Если мы хотим определить константный указатель на неконстантный бъект, надо использовать следующую запись:
int x; int const * p = &x;Такой указатель надо инициализировать сразу при описании, так как ему нельзя присваивать никаких значений (он константный!). Впрочем, такую запись в C++ почти не употребляют, поскольку такого же эффекта можно достичь с помощью ссылки. Наоборот, указатели на константные объекты и ссылки на константные объекты встречаются на каждом шагу, ведь они гарантируют, что объект, на который ссылается указатель, не будет испорчен даже в результате неправильных действий. Указатель на константный объект позволяет прочесть объект, но не дает возможности изменить его.
Переменная типа "указатель на константный объект" или "ссылка на константный объект" вовсе не обязательно должна ссылаться только на константные объекты! Напротив, чаще всего такие указатели хранят адреса самых обычных объектов. Такой указатель лишь не дает возможности изменить объект, на который он ссылается. Например, мы передаем константный указатель на объект как аргумент некоторой функции. Константность указателя означает, что функция сможет "прочитать" объект, но не сможет его "испортить".
Константные методы классов – это те методы, которые гарантированно не меняют объекта, к которому они применяются. К константным объектам можно применять лишь константные методы. Константный метод задается с помощью модификатора "const", который записывается после круглых скобок, содержащих параметры метода. Например, для класса R2Vector метод "length", вычисляющий длину вектора, является константным. Описание его прототипа в h-файле выглядит так:
class R2Vector {... double length() const;... };Как правило, все методы, которые выдают какие-либо характеристики объекта, должны быть описаны как константные. В противном случае их нельзя будет применить для константных объектов или даже для нормальных объектов, доступ к которым осуществляется через константный указатель или ссылку!
Бывают, однако, и менее очевидные ошибки. Не забывайте о следующей возможности C++: может быть несколько одинаковых методов одного и того же класса, но с разными формальными параметрами – как иногда говорят, с разной сигнатурой. Это знают все без исключения программисты на C++, однако не все помнят, что модификатор "const" также включается в сигнатуру метода! Это означает, что у класса могут быть два метода, которые отличаются только модификатором "const"; например, такая запись вовсе не является ошибкой:
class A {... int f(); int f() const;... };
Первый (неконстантный) метод "f" применяется к обычным объектам, второй – к константным. Рассмотрим следующий фрагмент кода:
A x; const A y;... int res1 = x.f(); int res2 = y.f();К объекту "x" применяется первый, неконстантный метод "f", к объекту "y" – второй, константный метод "f".
class Matrix { const int n; const int m; double* elements; public:... double& at(int i, int j) { return elements[i*m + j]; } const double& at(int i, int j) const { return elements[i*m + j]; } double* operator[](int i) { return elements + i*m; } const double* operator[](int i) const { return elements + i*m; }... };Подведем итог:
o метод обязательно должен быть описан как константный, если он не меняет объекта, к которому применяется;
o для доступа к внутреннему элементу объекта класса должно быть два метода с одинаковым названием, обычный и константный. Обычный метод возвращает ссылку или указатель на элемент объекта, константный метод – константную ссылку или константный указатель.
Дата добавления: 2015-11-16; просмотров: 65 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Замена множественного наследования наследованием от интерфейсов в других языках объектно-ориентированного программирования | | | Проблемы, порождаемые наличием константных методов |