Инструменты пользователя

Инструменты сайта


examination:oop:question25

25. Члены-данные: назначение, основные свойства. Синтаксис и семантика определений членов-данных.

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

Функции-члены

Посмотрим, как можно представить в языке понятие даты, используя для этого тип структуры и набор функций, работающих с переменными этого типа:

struct date { int month, day, year; };
date today;
void set_date(date*, int, int, int);
void next_date(date*);
void print_date(const date*);
// ...

Никакой явной связи между функциями и структурой date нет. Ее можно установить, если описать функции как члены структуры:

struct date {
  int month, day, year;
  void set(int, int, int);
  void get(int*, int* int*);
  void next();
  void print();
};

Описанные таким образом функции называются функциями-членами. Их можно вызывать только через переменные соответствующего типа, используя стандартную запись обращения к члену структуры:

date today;
date my_birthday;
void f()
{
  my_birthday.set(30,12,1950);
  today.set(18,1,1991);
  my_birthday.print();
  today.next();
}

Поскольку разные структуры могут иметь функции-члены с одинаковыми именами, при определении функции-члена нужно указывать имя структуры:

void date::next()
{
  if (++day > 28 ) {
    // здесь сложный вариант
  }
}

В теле функции-члена имена членов можно использовать без указания имени объекта. В таком случае имя относится к члену того объекта, для которого была вызвана функция.

Классы

Мы определили несколько функций для работы со структурой date, но из ее описания не следует, что это единственные функции, которые предоставляют доступ к объектам типа date. Можно установить такое ограничение, описав класс вместо структуры:

class date {
  int month, day, year;
  public:
  void set(int, int, int);
  void get(int*, int*, int*);
  void next();
  void print()
};

Служебное слово public (общий) разбивает описание класса на две части. Имена, описанные в первой частной (private) части класса, могут использоваться только в функциях-членах. Вторая - общая часть - представляет собой интерфейс с объектами класса. Поэтому структура – это такой класс, в котором по определению все члены являются общими. Функции-члены класса определяются и используются точно так же, как было показано в предыдущем разделе:

void date::print() // печать даты в принятом в США виде
{
  cout << month << '/' << day << '/' << year ;
}

Однако от функций не членов частные члены класса date уже ограждены:

void backdate()
{
  today.day--;
}
// ошибка

Есть ряд преимуществ в том, что доступ к структуре данных ограничен явно указанным списком функций. Любая ошибка в дате (например, December, 36, 1985) могла быть внесена только функцией- членом, поэтому первая стадия отладки - локализация ошибки – происходит даже до первого пуска программы. Это только частный случай общего правила: любое изменение в поведении типа date может и должно вызываться изменениями в его членах.

Другое преимущество в том, что потенциальному пользователю класса для работы с ним достаточно знать только определения функций-членов.

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


Реализация членов – данных

1. Конструкция становится членом-данным, если ее объявление размещается в какой-либо секции класса. 2. Член-данное представляет собой определение переменной, которое есть сочетание типа и имени. Формат члена-данного:

          Имя_типа имя_данного
          

Пример:

Double X; // абсцисса на плоскости
Double Y; // ордината 
Double R; // R>=0
Double Fi; // Fi принадлежит [0, 2Pi]
 
/* Пример класса, представляющего точку на плоскости*/
Class Point
{
Double X; // абсцисса на плоскости
Double Y; // ордината
Double R; // R>=0
Double Fi; // Fi принадлежит [0, 2Pi]
}

3. В качестве типов членов данных могут использоваться:

  • Предопределенный тип языка
  • Тип «класс» определенный пользователем
  • Указатель на предопределенный тип или тип «класс»
  • Ссылка на предопределенный тип или тип «класс»

4. Использование указателя или ссылки не требует определение класса, достаточно только объявление класса. 5. При объявлении члена-данного, как члена класса инициализация невозможна

Class Point
{//…
Double X=0; // ошибка!!!
//…
}

Члены данные м.б. инициализированы только конструктором

6. Потенциальные пользователи члена данного могут быть

  • Члены-функции своего класса
  • Другие функции не принадлежащие этому классу

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

8. Функции не принадлежащие классу, в котором определен член-данное могут обращаться к этому данному только в том случае, если им разрешен доступ. Уровень доступа определяет метка секции в которой определен член-данное

  • В открытой –разрешен доступ для любой функции
  • В защищенной – из функций не принадлежащих этому классу к нему имеет доступ только функции классов наследников
  • В закрытой – не имеет ни какого доступа функция, не принадлежащая этому классу

9. Обращение к члену-данному, если это обращение разрешает уровень доступа, внешних функций осуществляется двумя способами

  • Использование оператора селекции «.»
  • С использованием оператора указывания «→»

Для реализации первого способа нужно знать имя, а второго – указатель на этот экземпляр.

examination/oop/question25.txt · Последние изменения: 2014/01/15 12:22 (внешнее изменение)