Лекции.ИНФО


Рассмотрим подробно объявление этого класса.



По умолчанию члены класса являются закрытыми (private-членами).

Все члены класса queue объявлены в теле инструкции class. Членами данных класса queue являются переменные q, sloc и rloc. Кроме того, здесь определено три функции-члена: init(), qput() и qget().

Любой класс может содержать как закрытые, так и открытые члены. По умолчанию все элементы, определенные в классе, являются закрытыми. Например, переменные q, sloc и rloc являются закрытыми. Это означает, что к ним могут получить доступ только другие члены класса queue; никакие другие части программы этого сделать не могут. В этом состоит одно из проявлений инкапсуляции: программист в полной мере может управлять доступом к определенным элементам данных. Закрытыми можно объявить и функции (в этом примере таких нет), и тогда их смогут вызывать только другие члены этого класса.

Ключевое слово public используется для объявления открытых членов класса.

Чтобы сделать части класса открытыми (т.е. доступными для других частей программы), необходимо объявить их после ключевого слова public. Все переменные или функции, определенные после спецификатора public, доступны для всех других функций программы. Итак, в классе queue функции init(), qput() и qget() являются открытыми. Обычно в программе организуется доступ к закрытым членам класса через его открытые функции. Обратите внимание на то, что после ключевого слова public стоит двоеточие.

Следует иметь в виду, что объект образует своего рода связку между кодом и данными. Так, любая функция-член имеет доступ к закрытым элементам класса. Это означает, что функции init(), qput() и qget() имеют доступ к переменным q, sloc и rloc. Чтобы добавить функцию-член в класс, определите ее прототип в объявлении этого класса.

Определив класс, можно создать объект этого "классового" типа, используя имя класса. Таким образом, имя класса становится спецификатором нового типа. Например, при выполнении следующей инструкции создается два объекта Q1 и Q2 типа queue,

queue Q1, Q2;

После создания объект класса будет иметь собственную копию членов данных, которые составляют класс. Это означает, что каждый из объектов Q1 и Q2 будет иметь собственные отдельные копии переменных q, sloc и rloc. Следовательно, данные, связанные с объектом Q1, отделены (изолированы) от данных, связанных с объектом Q2.

Чтобы получить доступ к открытому члену класса через объект этого класса, используйте оператор "точка" (именно так это делается и при работе со структурами). Например, чтобы вывести на экран значение переменной sloc, принадлежащей объекту Q1, используйте следующую инструкцию.

cout << Q1.sloc;

Давайте вспомним: в C++ класс создает новый тип данных, который можно использовать для создания объектов. В частности, класс создает логическую конструкцию, которая определяет отношения между ее членами. Объявляя переменную класса, мы создаем объект. Объект характеризуется физическим существованием и является конкретным экземпляром класса. (Другими словами, объект занимает определенную область памяти, а определение типа — нет.) Более того, каждый объект класса имеет собственную копию данных, определенных в этом классе.

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

Чтобы реализовать функцию, которая является членом класса, необходимо сообщить компилятору, какому классу она принадлежит, квалифицировав имя этой функции с именем класса. Например, вот как можно записать код функции qput().

Void queue::qput(int i)

{

 if(sloc==100) {

  cout << "Очередь заполнена.";

  return;

 }

 sloc++;

 q[sloc] = i;

}

Оператор разрешения области видимости квалифицирует имя члена вместе с именем его класса.

Оператор "::" называется оператором разрешения области видимости. По сути, он сообщает компилятору, что данная версия функции qput() принадлежит классу queue. Другими словами, оператор "::" заявляет о том, что функция qput() находится в области видимости класса queue. Различные классы могут использовать одинаковые имена функций. Компилятор же определит, к какому классу принадлежит функция, с помощью оператора разрешения области видимости и имени класса.

Функции-члены можно вызывать только относительно заданного объекта. Чтобы вызвать функцию-член из части программы, которая находится вне класса, необходимо использовать имя объекта и оператор "точка". Например, при выполнении этого кода будет вызвана функция init() для объекта ob1.

queue ob1, ob2;

ob1.init();

При вызове функции ob1.init() действия, определенные в функции init(), будут направлены на копии данных, относящиеся к объекту ob1. Следует иметь в виду, что ob1 и ob2 — это два отдельных объекта. Это означает, что, например, инициализация объекта ob1 отнюдь не приводит к инициализации объекта ob2. Единственное, что связывает объекты ob1 и ob2, состоит в том, что они имеют один и тот же тип.

Если одна функция-член вызывает другую функцию-член того же класса, не нужно указывать имя объекта и использовать оператор "точка". В этом случае компилятор уже точно знает, какой объект подвергается обработке. Имя объекта и оператор "точка" необходимы только тогда, когда функция-член вызывается кодом, расположенным вне класса. По тем же причинам функция-член может непосредственно обращаться к любому члену данных своего класса, но код, расположенный вне класса, должен обращаться к переменной класса, используя имя объекта и оператор "точка".

В приведенной ниже программе класс queue иллюстрируется полностью (для этого объединены все уже знакомые вам части кода и добавлены недостающие детали).

#include <iostream>

using namespace std;

// Создание класса queue.

class queue {

  int q[100];

  int sloc, rloc;

 public:

  void init();

  void qput(int i);

  int qget();

};

// Инициализация класса queue.

Void queue::init()

{

 rloc = sloc = 0;

}

// Занесение в очередь целочисленного значения.

Void queue::qput(int i)

{

 if(sloc==100) {

  cout << "Очередь заполнена.";

  return;

 }

 sloc++;

 q[sloc] = i;

}

// Извлечение из очереди целочисленного значения.

Int queue::qget()

{

 if(rloc == sloc) {

  cout << "Очередь пуста.";

  return 0;

 }

 rloc++;

 return q[rloc];

}

Int main()

{

 queue a, b; // Создание двух объектов класса queue.

 а.init();

 b.init();

 a.qput(10);

 b.qput(19);

 a.qput(20);

 b.qput(1);

 cout << "Содержимое очереди a: ";

 cout << a.qget() << " ";

 cout << a.qget() << "";

 cout << "Содержимое очереди b: ";

 cout << b.qget() << " ";

 cout << b.qget() << "";

 return 0;

}

При выполнении эта программа генерирует такие результаты.

Содержимое очереди а: 10 20

Содержимое очереди b: 19 1

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

а.rloc = 0;

Нельзя включить в функцию main() нашей программы.

Общий формат объявления класса

Все классы объявляются подобно приведенному выше классу queue. Общий формат объявления класса имеет следующий вид.

class имя_класса {

  закрытые данные и функции

 public:

  открытые данные и функции

} список_объектов;

Здесь элемент имя_класса означает имя класса. Это имя становится именем нового типа, которое можно использовать для создания объектов класса. Объекты класса можно создать путем указания их имен непосредственно за закрывающейся фигурной скобкой объявления класса (в качестве элемента список_объектов), но это необязательно. После объявления класса его элементы можно создавать по мере необходимости.

Доступ к членам класса

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

// Демонстрация доступа к членам класса.

#include <iostream>

using namespace std;

class myclass {

  int a; // закрытые данные

 public:

  int b; // открытые данные

  void setab(int i); // открытые функции

  int geta();

  void reset();

};

Void myclass::setab(int i)

{

 a = i; // прямое обращение к переменной а

 b = i*i; // прямое обращение к переменной b

}

Int myclass::geta()

{

 return a; // прямое обращение к переменной а

}

Void myclass::reset()

{

// Прямой вызов функции setab()









Читайте также:

  1. VI.2. Педагогический стиль и его влияние на межличностные отношения и психологический климат в коллективе класса.
  2. Анна Михайловна Панкратова (1897 - 1957) и формирование официальной концепции истории рабочего класса.
  3. Билеты на ГКК для матросов 2 класса.
  4. БЫСТРЫЙ ПОПЕРЕЧНЫЙ РАСПИЛ ДРЕВА РОМАНТИЗМА 1888 ГОДА — КОЙ-КАКИЕ ПОДРОБНОСТИ
  5. В зависимости от расположения верхних передних зубов при II классе аномалии Э. Энгль выделил два подкласса.
  6. В конце XX столетия предложения этого ученого выглядят как никогда кстати.
  7. Все выводы должны быть записаны в тетради ПОДРОБНО, каждый отвечающий должен уметь воспроизвести решение, не используя тетрадь.
  8. Вы принимали участие в выборах губернатора Нижегородской области летом этого года?
  9. Вымогательство. Квалифицирующие признаки. Проблемы квалифика-ции этого преступления.
  10. Для этого режима сопротивления схем замещения
  11. ДОПОЛНИТЕЛЬНЫЕ ПОДРОБНОСТИ АНАЛИЗА ЦЕПЕЙ (по Балло)
  12. Институт — это совокупность, состоящая из правила и внешнего механизма принуждения индивидов к исполнению этого правила


Последнее изменение этой страницы: 2016-03-17; Просмотров: 91;


lektsia.info 2017 год. Все права принадлежат их авторам! Главная