Шаг 7.
Компонентные данные (данные класса)

    На этом шаге мы начнем разговор о данных класса.

    При определении класса в его теле описываются данные класса и принадлежащие ему функции. На этом шаге мы начнем рассматривать особенности их описания.

    Определение данных класса внешне аналогично обычному описанию объектов базовых и производных типов. Класс в этом отношении полностью сохраняет все особенности структурных типов. Именно поэтому данные класса могут быть названы его элементами. Элементы класса могут быть как базовых, так и производных типов, т.е. компонентными данными служат переменные, массивы, указатели и т.д. Как обычно, описания элементов одного типа могут быть объединены в одном операторе. Например:

     class point { float х, у, z; long а, b, с; };

    В отличие от обычного определения данных при описании элементов класса не допускается их инициализация. Это естественное свойство класса, так как при его определении еще не существует участков памяти, соответствующих его компонентным данным. Напоминаем, что память выделяется не для класса, а только для объектов класса. Для инициализации компонентных данных объектов должен использоваться автоматический или явно вызываемый конструктор соответствующего класса. Существуют различия между обращениями к компонентным данным класса из принадлежащих ему функций и из других частей программы. Как уже показано на примерах, в классах complex, goods, stroka, принадлежащие классу функции, имеют полный доступ к его данным, т.е. для обращения к элементу класса из тела компонентной функции достаточно использовать только имя компонента. Например, в одном конструкторе класса stroka использован оператор:

      ch = new char[len +  1];

    За простотой такого обращения к данным класса из его компонентных функций скрывается механизм неявного отождествления имен компонентных данных класса с элементами именно того объекта класса, для которого вызывается компонентная функция. Например, при таком определении объекта line класса stroka:

   stroka   line(20);
значения присваиваются именно переменным line.len и line.ch.

    Для доступа к компонентным данным из операторов, выполняемых вне определения класса, непосредственное использование имен элементов недопустимо. Смысл такого запрета определяется упомянутым механизмом привязки данных класса к конкретным объектам. Напомним, что по существу в определение класса не вводятся его данные, а только обозначается возможность их формирования при определении конкретных объектов класса. Явно размещается в памяти не класс, а конкретный объект класса. В отведенной для объекта области памяти выделяются участки, соответствующие компонентным данным (элементам объекта). Для обращения к элементу объекта, как мы уже говорили, нужно использовать операции выбора компонентов класса (шаги 2 и 3). Первая из них позволяет сформировать уточненное имя по известному имени объекта:

     имя_объекта. имя_элемента

    Вторая операция обеспечивает обращение к компонентным данным объекта по заданному указателю на объект:

     указатель_на_объект->имя_элемента

    Подытожим особенности компонентов класса. Хотя внешне компонентные данные класса могут быть подобны данным, определенным в блоке или в теле функции, но существуют некоторые существенные отличия.

  1. Данные класса не обязательно должны быть определены или описаны до их первого использования в принадлежащих классу функциях.
  2. То же самое справедливо и для принадлежащих классу функций, т.е. обратиться из одной функции класса к другой можно до ее определения внутри тела класса.
  3. Все компоненты класса "видны" во всех операторах его тела. Именно поэтому, кроме областей видимости "файл", "блок", "функция", в C++ введена особая область видимости "класс".

    На следующем шаге мы продолжим разговор о компонентных данных класса, в частности, поговорим о статических компонентах класса.




Предыдущий шаг Содержание Следующий шаг