10237

Классы в C++

Лекция

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

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

Русский

2013-03-24

108 KB

14 чел.

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

   } 

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


 

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

34533. Социалистический реализм 16.34 KB
  Интеллигенция была к ним восприимчива этим и было обусловлено влияние политика на искусство это вело к художественным потерям. Искусство для искусства – требования безответственности ибо искусство не может отстаивать роскошь в мире безмерных страданий не рискуя стать ложью. Искусство соцреализма – искусство пропаганды. Розовая библиотека – искусство не отражает действительность а искажает ее.
34534. Тема ясности в Творчестве А. Барбюса 17 KB
  Герой романа автобиографичен: на пути прощания с ложными иллюзиями он проходит сквозь очищающий огонь к ясности что в лексиконе писателя означает истину и правду. Многие участники войны до того считавшие что ими двигал патриотизм и жажда справедливости теперь увидели в героях романа свою собственную судьбу. Главный замысел романа прозрение солдатской массы реализуется преимущественно в публицистическом ключе подзаголовок романа дневник взвода. Персонажи романа называют себя палачами и не хотят чтобы о них говорили как о...
34535. Жанровое и стилевое своеобразие Прозы М. Пруста. Повествовательная организация романа В сторону Свана 16.84 KB
  цикл В поисках утраченного времени т. Герой испытывает подлинный интерес к литературе и искусству но его собственные творческие попытки в течение долгого времени безрезультатны. Лишь в последнем романе цикла Обретённое время герой начинает писать роман о своей жизни ибо убеждается в том что только художественное творчество основанное на интуиции сообщает смысл человеческому существованию утраченному времени . привлекают внимание к явлениям субъективного восприятия пространства и времени и особенно непроизвольной памяти; внутренняя...
34536. Традиция семейного романа во франц. л-ре 20 в. (Р. Роллан, Ф. Мориак, Э. Базен) 15.92 KB
  Приступая к рассмотрению многотомных семейных циклов которые продолжают появляться во французской литературе послевоенного периода следует поставить вопрос о характере этого жанра как такового.Прежде всего надо отметить что то обстоятельство что сюжеты этих циклов связаны рамками одного или нескольких семейств отнюдь не означает их асоциальности. Во Франции например начиная с РугонМаккаров вплоть до Семьи Тибо и до нынешних послевоенных семейных циклов все это подчеркнуто социальные произведения которые выходят далеко за пределы...
34537. Проблема гуманизма в произведениях А. Де Сент-Экзюпери. «Маленький принц» как сказка-притча 18.04 KB
  Маленький принц как сказкапритча. Маленький принц был написан в 1943 году и трагедия Европы во второй мировой войне воспоминания писателя о разгромленной оккупированной Франции накладывают свой отпечаток на произведение. То что Маленький принц сказка мы определяют по имеющимся в повести сказочным признакам: фантастическое путешествие героя сказочные персонажи Лис Змея Роза. Прообразом литературной сказки Маленький принц можно считать фольклорную волшебную сказку с бродячей фабулой: прекрасный принц изза несчастной любви...
34538. От Сюрреализма к соцреализму. Арагон и Элюар 18.91 KB
  Арагон и Элюар СЮРРЕАЛИЗМ Мировой центр – Париж но среди участников движения были и немцы и чехи и американцы. Участники необычайно имениты: Арагон Ренуар Дали и т. Арагон поэт и романист которому принадлежит видное место во французской литературе социалистического реализма крупный общественный деятель. стала для Арагона первой школой жизни.
34539. Своеобразие мифотворчества Ф. Кафки 18.94 KB
  Странность Грегоранасекомого в том что он начинает превращаться и превращается не в насекомое а в Человека. Звучит абсурдно но мизансцена свидетельствует о том что Грегор трутень на нем паразитирует вся семья. Грегор Замза просыпаясь утром понимает кто он есть на самом деле и образ жука здесь служит символом очищения души ее возрождении и освобождении от гнета. Грегор человек в обличии насекомого; его родичи насекомые в человеческом облике.
34540. Теория эпического театра и Конфликт и его худ. воплощение в пьесах Брехта 17.5 KB
  Среди наиболее знаменитых пьес эмиграции Матушка Кураж и ее дети 1939. В условиях 30х годов Матушка Кураж звучала конечно как протест против демагогической пропаганды войны фашистами и адресовалась той части немецкого населения которая поддалась этой демагогии. Сущность эпического театра становится особенно ясной в связи с Матушкой Кураж . Поэтому в Матушке Кураж столь последовательный и выдержанный даже в мелких деталях подлинный лик жизни.
34541. Тема «потерянного поколения» в литературе 1 половины 20 в. (Э.М. Ремарк, Р. Олдингтон, Ф.С. Фицджеральд, Э. Хемингуэй и др.) 17.11 KB
  и Хемингуэя Прощай оружие. Все вы потерянное поколение эпиграф Хемингуэя затем стал лит. Они индивидуалисты и надеются как герои Хемингуэя лишь на себя на свою волю а если и способны на решительный общественный поступок то сепаратно заключая договор с войной и дезертируя. Хемингуэй рассказал о возвращении с войны сборник рассказов В наше время 1925 о сущности неприкаянной жизни фронтовиков и их подруг об одиночестве невест не дождавшихся возлюбленных Фиеста 1926 о горечи прозрения после первого ранения и утраты...