ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 6) онлайн

Константные объекты

В нескольких наших примерах мы видели, что ключевое слово const можно при- менять для защиты от изменения значений переменных стандартных типов, та- ких, как, например, int. Оказывается, аналогичным способом мы можем приме- нять модификатор const и для объектов классов. Если объект класса объявлен с модификатором const, он становится недоступным для изменения. Это означает, что для такого объекта можно вызывать только константные методы, поскольку только они гарантируют, что объект не будет изменен. В качестве примера рас- смотрим программу CONSTOBJ.

//constObj.cpp

//constant Distance objects

#include <iostream>

using namespace std;

//////////////////////////////////////////////////////////

class Distance               // длина в английской системе

{

  private:

    int feet;

    float inches;

  public:                    // конструктор с двумя аргументами

    Distance(int ft, float in) : feet(ft), inches(in)

      { }

    void getdist()           // неконстантный метод

    {

      cout << "\nВведите число футов: "; cin >> feet;

      cout << "Введите число дюймов: "; cin >> inches;

    }

void showdist() const        // константный метод

  { cout << feet << "\'-" << inches << '\"'; }

};

//////////////////////////////////////////////////////////

int main()

{

  const Distance football(300,0);

  //football.getdist();      // ошибка: метод getdist() неконстантный

  cout << " Длина поля равна ";

  football.showdist();       // корректно

  cout << endl;

  return 0;

}

Футбольное поле в американском футболе имеет длину ровно 300 футов. Если бы нам было необходимо использовать в программе величину, выражаю- щую длину футбольного поля, то для нас имело бы смысл сделать эту величину константной. Именно это и сделано в программе CONSTOBJ в отношении объекта football. Теперь для этого объекта можно вызывать только константные методы, например showdist(). Вызовы неконстантных методов, таких, как getdist(), кото- рый присваивает полям объекта значения, вводимые пользователем, являют- ся некорректными. Таков механизм, обеспечивающий требуемую константность объекта football.

Когда вы создаете класс, всегда является хорошим стилем объявлять кон- стантными функции, не изменяющие полей объектов класса. Это позволяет то- му, кто использует данный класс, создавать константные объекты класса. Из этих объектов могут вызываться только константные функции. Использование модификатора const упрощает компилятору задачу оказания вам своевременной помощи в процессе создания программы.

 

28