Министерство высшего и среднего специального образования республики узбекистана
Константные объекты и константные функции-элементы
Download 164.64 Kb.
|
ООП
- Bu sahifa navigatsiya:
- ResetCoord(10,10);
Константные объекты и константные функции-элементы
Если создать представитель класса с модификатором const, то компилятор будет проинформирован, что содержимое объекта не должно изменяться после инициализации. Чтобы предотвратить изменение значений элементов константного объекта, компилятор генерирует сообщение об ошибке, если объект используется с неконстантной функцией-элементом. Константная функция-элемент, объявляемая с ключевым словом const после списка параметров, должна удовлетворять следующим правилам: • она не может изменять значение элементов данных класса; • не может вызывать неконстантные функции-элементы класса; • может вызываться как для константных, так и неконстантных объ-ектов класса. Для того чтобы сделать функцию константной, необходимо указать ключевое слово const после прототипа функции, но до начала тела функции. Если объявление и определение функции разделены, то модификатор const необходимо указать дважды – как при объявлении, так и при ее определении. Те методы, которые только лишь считывают данные из поля класса, имеет смысл делать константными, поскольку у них нет необходимости изменять значения полей объектов класса. Например: class CCoord { int iX, iY; public: void SetCoord(int _iX, int _iY); void GetCoord(int &_iX, int &_iY) const; }; void CCoord::SetCoord(int _iX, int _iY) { iX = _iX; iY = _iY; } void CCoord::GetCoord(int &_iX, int &_iY) const { _iX = iX; _iY = iY; } int main(void) { CCoord c1; //создаем не константный объект const CCoord c2; //создаем константный объект int x, y; c1.SetCoord(10,10); /* - разрешено – вызов не-константной функции для не константного объекта */ c2.SetCoord(10,10); /* - запрещено – вызов не-константной функции для константного объекта */ c1.GetCoord(x, y); /* - разрешено: вызов констант-ной функции для не константного объекта */ c2.GetCoord(x, y); /* - разрешено: вызов констант-ной функции для константного объекта */ return 0; } Обычно константные объекты создают для того, чтобы получить гарантии того, что данные объекта невозможно будет изменить. Однако иногда случаются ситуации, когда вы хотите создать объект-константу, имеющий определенное поле, которое нужно будет изменять, несмотря на то, что сам объект является константой. Для этих целей необходимо соответствующее поле объявить со спецификатором mutable. Например, объявив в предыдущем примере поля iX, iY следующим образом: mutable int iX, iY; Мы сможем создать константную функцию ResetCoord(10,10); разрешив тем самым модификацию полей константного объекта: class CCoord { mutable int iX, iY; public: void SetCoord(int _iX, int _iY); void ResetCoord(int _iX, int _iY) const; void GetCoord(int &_iX, int &_iY) const; }; void CCoord::SetCoord(int _iX, int _iY) { iX = _iX; iY = _iY; } void ResetCoord(int _iX, int _iY) const { iX = _iX; iY = _iY; } void CCoord::GetCoord(int &_iX, int &_iY) const { _iX = iX; _iY = iY; } int main(void) { CCoord c1; const CCoord c2; int x, y; c1.SetCoord(10,10); /* - разрешено – вызов не-константной функции для неконстантного объекта */ c2.SetCoord(10,10); /* - запрещено – вызов не-константной функции для константного объекта */ c1.GetCoord(x, y); /* - разрешено: вызов констант-ной функции для неконстантного объекта */ c2.GetCoord(x, y); /* - разрешено: вызов констант-ной функции для константного объекта */ c2.ResetCoord(10, 10); /* - разрешено, т.к. iX, iY объявлены со спецификатором mutable */ return 0; } Download 164.64 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling