10237

Классы в C++

Лекция

Информатика, кибернетика и программирование

Лекция 2. Классы. Класс представляет собой главное инструментальное средство C для объектно-ориентированного программирования. Класс похож на структуру в которой сгруппированы элементы соответствующие данным о некотором объекте и оперирующие этими данными фун

Русский

2013-03-24

108 KB

18 чел.

Лекция 2. Классы.

  Класс представляет собой главное инструментальное средство C++ для объектно-ориентированного программирования. Класс похож на структуру, в которой сгруппированы элементы, соответствующие данным о некотором объекте, и оперирующие этими данными функции (называемые методами). Класс C++ позволяет программам определять все атрибуты объекта.

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

  Класс C++ должен иметь уникальное имя, за которым следует открывающая фигурная скобка, один или несколько элементов и закрывающая фигурная скобка:

   class class_name

   {

      int data_member;               // Элемент данных

      void show_member(int);  // Функция-элемент

   }; 

После определения класса можно объявлять переменные типа этого класса (называемые объектами):

                  class_name object_one, object_two, object_three; 

Следующее определение создает класс employee, который содержит определения данных и метода:

   class employee

   {

      public:

      char name[64];

      long employee_id;

      float salary;

      void show_employee(void)

      {

         cout << "Имя: " << name << endl;

         cout << "Номер служащего: " << employee_id << endl;

         cout << "Оклад: " << salary << endl;

      };

   }; 

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

     employee worker, boss, secretary; //Переменные класса (объекты)

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

 Primer 1 Лекция 2.

#include <iostream>

#include <string.h>

using namespace std;

  class employee

  {

  public:

     char name [64];

     long employee_id;

     float salary;

     void show_employee(void)

     {

        

        cout << "Имя: " << name << endl;

        cout << "Номер служащего: " << employee_id << endl;

        cout << "Оклад: " << salary << endl;

     };

  };

  int main()

  {

     system("chcp 1251");

     employee worker, boss;

     strcpy(worker.name, "Иванов");

     worker.employee_id = 12345;

     worker.salary = 25000;

     strcpy(boss.name, "Савин");

     boss.employee_id = 01;

     boss.salary = 100000.00;

     worker.show_employee();

     boss.show_employee();

     system("pause");

  }

  Программа объявляет два объекта типа employeeworker и boss, а затем использует оператор точку для присваивания значений элементам и вызова функции show_employee.
  
   2.2. Определение методов класса вне класса.
  
В предыдущем классе employee функция была определена внутри самого класса (встроенная (inline) функция). При увеличении функций определение встроенных функций внутри класса может внести беспорядок в описание класса. В качестве альтернативы можно поместить прототип функции внутри класса, а затем определить функцию вне класса. Определение класса с прототипом:

   class employee

   {

   public:

      char name[64];

      long employee_id;

      float salary;

      void show_employee(void);  //  Прототип функции

   };

Так как разные классы могут использовать функции с одинаковыми именами, необходимо предварять имена определяемых вне класса функций именем класса и оператором глобального разрешения ;:. Определение функции становится следующим:

void employee:: show_employee (void)        //Имя класса

   {

      сout << "Имя: " << name << endl; //Имя элемента 

     cout << "Номер служащего: " << employee_id << endl;

      cout << "Оклад: " << salary << endl;

   }; 

  Приведенный код предваряется определением функции с именем класса (employee) и оператором глобального разрешения :;. Следующая программа помещает определение функции show_employee вне класса, используя оператор глобального разрешения для указания имени класса:

 Primer 2 Лекция 2.

#include <iostream>

  #include <string.h>

  using namespace std;

  class employee

  {

  public:

     char name [64];

     long employee_id;

     float salary;

     void show_employee(void);

  };

  void employee::show_employee(void)

  {

     cout << "Имя: " << name << endl;

     cout << "Номер служащего: " << employee_id << endl;

     cout << "Оклад: " << salary << endl;

  };

  int main()

  {

     system("chcp 1251");

     employee worker, boss;

     strcpy(worker.name, "Иванов");

     worker.employee_id = 12345;

     worker.salary = 25000;

     strcpy(boss.name, "Савин");

     boss.employee_id = 01;

     boss.salary = 100000.00;

     worker.show_employee();

     boss.show_employee();

     system("pause");

  }

    2.3. Методы класса.

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

                  return_type class_name::function_name(parameters)

   {// Операторы }

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

 Primer 3 Лекция 2.

#include <iostream>

 #include <string.h>

  using namespace std;

  class dogs

  {

  public:

     char breed[64];

     int average_weight;

     int average_height;

     int show_breed();

  };

  int dogs::show_breed()

  {

     cout << "Порода: " << breed << endl;

     cout << "Средний вес: " << average_weight << endl;

     cout << "Средняя высота: " << average_height << endl;

  }

  int main()

  {

     system("chcp 1251");

     dogs happy, matt;

     strcpy(happy.breed, "Долматин");

     happy.average_weight = 58;

     happy.average_height = 24;

     strcpy(matt.breed, "Колли");

     matt.average_weight =22;

     matt.average_height = 15;

     happy.show_breed();

     matt.show_breed();

     system("pause");

  }

2.4. Сокрытие информации.

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

  class employee

   {

   public:

      char name [64];

      long employee_id;

      float salary;

      void show_employee(void);

   } 

  При создании класса можно иметь элементы, чьи значения используются только внутри класса, но обращаться к которым самой программе нет необходимости. Такие элементы являются частными (private), и их следует скрывать от программы. Если не используется метка public, то по умолчанию C++ подразумевает, что все элементы класса являются частными. Программы не могут обращаться к частным элементам класса, используя оператор точку. К частным элементам класса могут обращаться только элементы самого класса. При создании класса следует разделить элементы на частные и общие:

class some_class

   {

   public:

      int some_variable;

      void initialize_private(int, float);    // Общие элементы

      void show_data(void);

   private:

      int key_value;                                 // Частные элементы

      float key_number;

   }

  Метки public и private позволяют определять частные и общие элементы. Программа может использовать оператор точку для обращения к общим элементам:

                object.some_variable = 1001;

                object.initialize_private(2002, 1.2345);

                object.show_data() 

  Если ваша программа пытается обратиться к частным элементам key_value или key_number, используя точку, компилятор сообщает о синтаксических ошибках.

Необходимо защищать элементы класса от прямого доступа к ним делая их частными. При этом программы не могут непосредственно присваивать значения таким элементам, используя оператор точку. Вместо того чтобы присвоить значение, программа должна вызвать метод класса. Предотвращая прямой доступ к элементам данных, можно
гарантировать, что им всегда будут присваиваться допустимые значения. Например, предположим что объект nuclear_reactor вашей программы использует переменную с именем melt_down, которая всегда должна содержать значение в диапазоне от 1 до 5. Если элемент melt_down является общим, программа может непосредственно обратиться к элементу, изменяя его значение произвольным образом:

                          nuclear_reactor.melt_down = 101 

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

 int nuke::assign_meltdown(int value)

   {

      if ((value > 0) && (value <= 5))

      {

         melt_down = value;

         return(0);           // Успешное присваивание

      } else return(-1);  // Недопустимое значение

   } 

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


2.5. Использование общих и частных элементов класса.
Следующая программа иллюстрирует использование
общих и частных элементов класса. Программа определяет объект типа employee:

   class employee

   {

   public:

      int assign_values(char *, long, float);

      void show_employee(void);

      int change_salary(float);

      long get_id(void);

   private:

      char name [64];

      long employee_id;

      float salary;

   } 

Класс защищает все свои элементы данных, объявляя их частными. Для доступа к элементам данных программа должна использовать интерфейсные функции. Реализация программы:

 Primer 4 Лекция 2.

#include <iostream>

#include <string.h>

using namespace std;

  class employee

  {

  public:

     int assign_values(char *, long, float);

     void show_employee(void);

     int change_salary(float);

     long get_id(void);

  private:

     char name [64];

     long employee_id;

     float salary;

  );

  int employee::assign_values(char *emp_name, long emp_id, float emp_salary)

  {

     strcpy(name, emp_name);

     employee_id = emp_id;

     if (emp_salary < 50000.0)

     {

        salary = emp_salary;

        return(0); // Успешно

      }

     else

  return(-1); // Недопустимый оклад }

  int employee::show_employee()

  {

     cout << "Служащий: " << name << endl;

     cout << "Номер служащего: " << employee_id << endl;

     cout << "Оклад: " << salary << endl;

  }

  int employee::change_salary(float new_salary)

  {

     if (new_salary < 50000.0)

     {

        salary = new_salary;

        return(0); // Успешно } else return(-1); // Недопустимый оклад }

  long employee::get_id()

  {

     return(employee_id);

  }

  int main()

  {

     system("chcp 1251");

     employee worker;

     if (worker.assign_values("Happy Jamsa", 101, 10101.0) == 0)

     {

        cout << "Служащему назначены следующие значения" << endl;}

        worker.show_employee();

        if (worker.change_salary(35000.00) == 0)

        {

           cout << "Назначен новый оклад" << endl;

           worker.show_employee();

        }

     }

     else

     cout << "Указан недопустимый оклад" << endl;

     system("pause");

  }

  Метод assign_values инициализирует частные данные класса. Метод использует оператор if, чтобы убедиться, что присваивается допустимый оклад. Метод show_employee в данном случае выводит частные элементы данных. Методы change_salary и get_id представляют собой интерфейсные функции, обеспечивающие программе доступ к частным данным. После успешной компиляции и запуска этой программы отредактируйте ее и попытайтесь обратиться напрямую к частным элементам данных, используя оператор точку внутри main. Так как вы не можете напрямую обратиться к частным элементам, компилятор сообщит о синтаксических ошибках.


2.6. Использование оператора глобального разрешения для элементов класса.

  Имена параметров функции часто предваряются символами етр:

int employee::assign_values(char *emp_name, long emp_id, float emp_salary)    Символы етр_ использовались, чтобы избежать конфликта между именами параметров и именами элементов класса. Если подобный конфликт имен всe же происходит, можно разрешить его, предваряя имена элементов класса именем класса и оператором глобального разрешения (:: ). Следующая функция использует оператор глобального разрешения и имя класса перед именем элементов класса. Исходя из этого, любой читающий эти операторы поймет, какие имена соответствуют классу employee:

 int employee::assign_values(char *name, long employee_id, float salary)

   {

      strcpy(employee::name, name);

      employee::employee_id = employee_id;

      if (salary < 50000.0)

   {

         employee::salary = salary;

      return(0); // Успешно } else

      return(-1); // Недопустимый оклад

   } 

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


 

А также другие работы, которые могут Вас заинтересовать

42496. Конфігурування бездротового маршрутизатора LinksysWRT54GL 229.5 KB
  Конфігурування бездротового маршрутизатора LinksysWRT54GLâ€. Мета: Навчитися налаштовувати бездротові маршрутизатори на основі моделі LinksysWRT54GL задавати імя бездротовій мережі SSID налаштовування вбудованого сервера DHCP конфігурування інтерфейсів WN LN Wireless налаштування шифрування WEP. Виконання лабораторної роботи Виконализєднання з маршрутизатом увійшли до інтерфейсу конфігурування.
42498. Дослідження кепстру сигналів 528.5 KB
  Зберігання виконаної роботи проводити виключно командою Sve ll 3. Для виконання лабораторної роботи скопіювати фрагмент коду позначений коментарем 8лабораторна робота: Кепстр сигналів в кінець програми після директиви endif. Вибрати пункт 8 та проаналізувати варіант виконання лабораторної роботи.
42499. Проектування волоконно-оптичної системи передачі інфопмації 256 KB
  Львів 2010 Мета роботи : Ознайомитися з послідовністю проектування ВОСП методикою інженерного розрахунку волоконно оптичних систем зв`язку а також отримати певні навики практичного розрахунку системи для заданих параметрів. Визначення потрібної швидкості передачі топології системи. Енергетична характеристика системи.
42500. Налаштування однорангової мережі у середовищі ОС Windows 98 29 KB
  Для перевірки заходимо в Сетевое окружение та дивимося чи зявився в мережі данний ПК. Висновок: В цій роботі я навчився налаштовувати компютер та встановлювати параметри для коректної роботи однорангової мережі у середовищі ОС Windows 98 міністерство науки і освіти України промисловоекономічний коледж НАУ Лабораторна робота № 8 З дисципліни: периферійні пристрої ЕОМ Тема роботи: налаштування однорангової мережі у середовищі ОС Windows 98 Виконав:...
42501. Измерение ЭДС источника методом компенсации 69 KB
  Краткие теоретические сведения ЭДС гальванического элемента не зависит от размеров электродов и количества электролита а определяется лишь их химическим составом и при данных условиях постоянна. Каждый тип элементов даёт определённую ЭДС.1 где  − ЭДС; I − сила тока; R − сопротивление внешней цепи; r − внутреннее сопротивление элемента.
42502. Определение ЭДС источника с помощью известного сопротивления 60 KB
  Оборудование: аккумуляторная батарея ЭДС которой определяется миллиамперметр магазин сопротивлений ключ. Это достигается с помощью ЭДС источника. При разомкнутой цепи разность потенциалов между полюсами источника равна ЭДС.
42503. ПОНЯТИЕ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ. МЕЖДУНАРОДНЫЕ И ОТЕЧЕСТВЕННЫЕ ИСТОЧНИКИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ 218.5 KB
  Результат интеллектуальной деятельности как объект права. Право интеллектуальной собственности как раздел гражданского права. Особенности права интеллектуальной собственности. Международные источники права интеллектуальной собственности. Национальные источники права интеллектуальной
42504. Исследование зависимости энергетических характеристик аккумулятора от нагрузки 256.5 KB
  Аккумуляторы – химические источники тока, в которых электрическая энергия получается за счёт химических реакций. На практике применяют аккумуляторы кислотные и щелочные. В качестве электролита в щелочных аккумуляторах используется 20 % раствор щёлочи в воде. В зависимости от химического состава электродов щелочные аккумуляторы делятся на железо-никелевые, кадмиево-никелевые, цинково-никелевые и т.д. Наиболее часто применяются железо-никелевые и кадмиево-никелевые.