Министерство высшего и среднего специального образования республики узбекистана


Константные объекты и константные функции-элементы


Download 164.64 Kb.
bet3/5
Sana25.02.2023
Hajmi164.64 Kb.
#1231224
1   2   3   4   5
Bog'liq
ООП

Константные объекты и константные функции-элементы
Если создать представитель класса с модификатором 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:
1   2   3   4   5




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling