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); // Недопустимый оклад

   } 

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


 

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

29577. Коммерческая и социальная реклама в СМК 15.24 KB
  Функции выполняемые социальной и коммерческой рекламы посредством СМК: 1. Коммерческая реклама: В соответствие с современным подходом к изучению рекламы коммерческая реклама входит в комплекс маркетинговых коммуникаций в который помимо рекламы входят такие инструменты как стимулирование сбыта PR пропаганда и личные продажи. Социальная реклама вид некоммерческой рекламы направленной на изменение моделей общественного поведения и привлечения внимания к проблемам социума. В 1993 году был образован негосударственный Рекламный Совет в...
29578. Состояние медиарынка в кризисный и поскризисный период, тенденции дальнейшего развития 24.52 KB
  Те компании которые выжили в это время оказались в очень неплохой ситуации. Как отмечают специалисты основным принципом коммуникаций в кризисной ситуации – не замалчивать события говорить все и как можно скорее. Однако на ранних стадиях кризисной ситуации не следует говорить вещей которых вы не знаете или в которых вы не уверены не следует включаться в догадки поскольку вы можете оказаться не правы. Американские специалисты предлагают учитывать следующие позиции в подобной ситуации [10 с.
29579. Телевидение XXI века: соотношение социальных, политических и коммерческих функций 13.23 KB
  Степень этой вовлеченности и мера воздействия ТВ на аудиторию в плоскости выполнения этой функции зависят от той системы в которой действует данное телевизионное СМИ. Особенно сильно подобное отношение к СМИ вообще и к ТВ в частности у населения постсоветских государств. Люди ждут реакции властей на критические выступления касающиеся тех или иных явлений жизни по инерции доставшейся от советской системы в то время как СМИ – лишь способ донести информацию об этих явлениях до своей аудитории. Дальнейшее зависит уже не от СМИ выпадающего из...
29580. Интернет: история, возможности и прогнозы 16.93 KB
  Интернет: история возможности и прогнозы. Исторически интернет произошел от американской сети RPNET которая разрабатывалась как децентрализованное средство обмена информацией в случае ядерного удара. Прототип интернета RPNET в 1969 соединил сеть американских научно исследовательских университетов. Следующим значительным скачком в развитии интернета стал концепт всемирной паутины выдвинутый в 1989 Тимом БернсЛи идея создания универсального языка HTML Аштэмэйли протокола связи HTTPАштэтэпэ что позволило сделать интернет таким каким он...
29581. Информационное общество: основные характеристики, тенденции развития. Дискуссии в отношении позитивных изменений и негативных последствий всеобщей информатизации и глобализации мирового пространства 16.15 KB
  Информационное общество – ступень в развитии современной цивилизации характеризующаяся увеличением роли информации и знаний в жизни общества; возрастанием доли инфокоммуникаций информационных продуктов и информационных услуг в валовом внутреннем продукте ВВП; созданием глобального информационного пространства обеспечивающего эффективное информационное взаимодействие людей их доступ к мировым информационным ресурсам и удовлетворение их социальных и личностных потребностей в информационных продуктах и услугах. Основные характеристики:...
29582. Массовое сознание 12.93 KB
  На общественное мнение влияют мнения людей признаваемых обществом авторитетными и компетентными личный опыт людей В формировании общественного мнения выделяются: субъект воздействия – элитные группы стремящиеся к достижению или удержанию власти заказчики и исполнители государство аналитики журналисты и т.; объект воздействия – массовое сознание изменение которого является целью субъекта; инструмент воздействия – СМИ как массмедиа так и институты социализации культура и т. Формы и способы влияния общественного мнения на личность...
29583. Массовое сознание: Субъективистский и объективистский подходы 14.37 KB
  Массовое сознание включает в себя понятие массы: МассаОртега и Гаса это суждение некомпетентных низкое качество современной цивилизации; Масса Юнгер механизное общество в котором человек является придатком машины; Масса Зиммель Вебер Манхейм – это бюрократическое общество которое отличается широко расчленненой организацией в которой принятие решений допускается на высших этапах иерархии; МассаЛенин – совокупность трудящихся наименее организованных и просвещенных. МассаШарков это шаблонное Например когда в деревнях все...
29584. Стратегия и тактика планирования рекламной кампании 16.33 KB
  Стратегия и тактика планирования рекламной кампании. Планирование рекламной кампании это процесс в котором принимают участие все структурные подразделения рекламного агентства и маркетинговый отдел рекламодателя. Результат этого процесса составление плана рекламной кампании на определенный период. Главная задача планирования рекламной кампании определить как будет доноситься рекламное послание до потребителя: в какой форме с помощью каких средств массовой информации и в рамках какого бюджета.
29585. Основные понятия в медиапланировании (рейтинг, доля, HUT, PUT, PUR). Их расчет и соотношение в планировании рекламных кампаний 33.55 KB
  Home Using TV одним из базовых показателей в медиапланировании является число людей или домохозяйств в которых смотрят телевизор. Этот показатель описывает количество людей или домохозяйств использующих ТВ на определенный момент времени Иными словами это процент индивидуумов или домохозяйств использующих телевизор в данное время дня. Показатель HUT не включает людей смотрящих телевизор вне дома например в магазинах аэропортах отелях и т. То есть рекламное сообщение смогут увидеть те люди которые по крайней мере в данный момент...