Введение в классы и объекты C ++

01

из 09

Начиная C ++ Классы

Руки печатать на ноутбуке
Сэм Эдвардс / Getty Images

Объекты самая большая разница между C ++ и C. Одним из первых имен для C ++ было C с классами.

Классы и Объекты

Класс - это определение объекта. Это тип как ИНТ. Класс напоминает структура только с одним отличием: все члены структуры по умолчанию общедоступны. Все члены класса являются частными.

Помните - класс - это тип, а объект этого класса - просто переменная.

Прежде чем мы сможем использовать объект, он должен быть создан. Самое простое определение класса:

 имя класса {

 // участники

 }


Этот пример класса ниже моделирует простую книгу. Использование ООП позволяет вам абстрагировать проблему и думать о ней, а не только о произвольных переменных.

 // пример первый

 #включают 

 #включают 


 учебник

 {

 int PageCount;

 int CurrentPage; 

 общественности:

 Книга (int Numpages); // Конструктор

 ~ Книга () {}; // Деструктор

 void SetPage (int PageNumber);

 int GetCurrentPage (void);

 }; 


 Book:: Book (int NumPages) {

 PageCount = NumPages;

 }


 void Book:: SetPage (int PageNumber) {
instagram viewer

 CurrentPage = PageNumber;

 }


 int Book:: GetCurrentPage (void) {

 вернуть CurrentPage;

 }


 int main () {

 Книга ABook (128);

 Книга. SetPage (56);

 std:: cout << "Текущая страница" << ABook. GetCurrentPage () << std:: endl;

 вернуть 0;

 }


Весь код от учебник вплоть до int Book:: GetCurrentPage (void) { Функция является частью класса. основной() Функция существует, чтобы сделать это работоспособным приложением.

02

из 09

Понимание класса книги

в основной() функция переменная Книга типа Book создается со значением 128. Как только выполнение достигает этой точки, создается объект ABook. На следующей строке метод Книга. SetPage () вызывается и значение 56 присваивается переменной объекта Книга. Текущая страница. потом соиЬ выводит это значение, вызывая Книга. GetCurrentPage () метод.

Когда исполнение достигает вернуть 0; объект ABook больше не нужен приложению. Компилятор генерирует вызов деструктора.

Объявление классов

Все между Учебник и } это объявление класса. Этот класс имеет два закрытых члена, оба типа int. Они являются закрытыми, поскольку доступ по умолчанию к членам класса является закрытым.

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

Эта строка ниже объявляет конструктор. Эта функция вызывается при первом создании объекта.

 Книга (int Numpages); // Конструктор 

Вызывается с линии

 Книга ABook (128); 

Это создает объект с именем ABook типа Book и вызывает функцию Book () с параметр 128.

03

из 09

Подробнее о классе книги

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

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

Помнить- класс xyz имеет функцию конструктора xyz () и функцию деструктора ~ xyz (). Даже если вы не объявите, компилятор автоматически добавит их.

Деструктор всегда вызывается, когда объект завершается. В этом примере объект неявно уничтожается, когда выходит из области видимости. Чтобы увидеть это, измените объявление деструктора следующим образом:

 ~ Book () {std:: cout << "Разрушитель вызван";}; // Деструктор 

Это встроенная функция с кодом в объявлении. Еще один способ встроить это добавить слово inline

 встроенная книга ~ (); // Деструктор


и добавить деструктор как функцию, подобную этой.

 встроенная книга:: ~ книга (недействительная) { 

 std:: cout << "Разрушитель вызван";

 }


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

04

из 09

Написание методов класса

Лучшая практика для объектов - сделать все данные частными и получить к ним доступ через функции, известные как функции доступа. SetPage () и GetCurrentPage () две функции, используемые для доступа к переменной объекта Текущая страница.

Изменить учебный класс объявление структурировать и перекомпилировать. Он все равно должен скомпилироваться и работать правильно. Теперь две переменные Количество страниц и Текущая страница являются общедоступными. Добавьте эту строку после Book ABook (128), и она скомпилируется.

 Книга. PageCount = 9;


Если вы измените структуру обратно на учебный класс и перекомпилировать, эта новая строка больше не будет компилироваться как Количество страниц теперь снова приватно.

:: Нотация

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

Если вы объявили функцию-член в классе, вы должны предоставить тело функции таким образом. Если вы хотите, чтобы класс Book использовался другими файлами, вы можете переместить объявление book в отдельный заголовок файл, возможно, называется book.h. Любой другой файл может затем включить его

 #include "book.h" 

05

из 09

Наследование и полиморфизм

Этот пример продемонстрирует наследование. Это приложение двух классов с одним классом, полученным из другого.

 #включают 

 #включают 


 Класс Point

 {


 int x, y;

 общественности:

 Точка (int atx, int aty); // Конструктор

 встроенный виртуальный ~ Point (); // Деструктор

 виртуальная пустота Draw ();

 }; 


 Класс Circle: public Point {


 внутренний радиус;

 общественности:

 Круг (int atx, int aty, int theRadius);

 встроенный виртуальный ~ Circle ();

 виртуальная пустота Draw ();

 };



 Point:: Point (int atx, int aty) {

 х = атх;

 y = aty;

 }


 встроенная точка:: ~ точка (пустота) { 

 std:: cout << "Точка Разрушитель вызвана";

 }


 void Point:: Draw (void) {

 std:: cout << "Point:: Draw point at" << x << "" << y << std:: endl;

 }



 Circle:: Circle (int atx, int aty, int theRadius): точка (atx, aty) {

 радиус = радиус;

 }


 встроенный круг:: ~ круг () {

 std:: cout << "Разрушитель круга вызван" << std:: endl;

 }


 void Circle:: Draw (void) {

 Point:: Draw ();

 std:: cout << "circle:: Draw point" << "Radius" << radius << std:: endl;

 }


 int main () {

 Круг ACircle (10,10,5);

 Круг. Привлечь() ;

 вернуть 0;

 }


В примере есть два класса, Point и Circle, моделирующие точку и окружность. Точка имеет координаты x и y. Класс Circle является производным от класса Point и добавляет радиус. Оба класса включают в себя Привлечь() функция-член. Чтобы этот пример был коротким, выводим только текст.

06

из 09

наследование

Класс Круг происходит от точка учебный класс. Это сделано в этой строке:

 Класс Circle: Point {


Поскольку он является производным от базового класса (Point), Circle наследует всех членов класса.

 Точка (int atx, int aty); // Конструктор

 встроенный виртуальный ~ Point (); // Деструктор

 виртуальная пустота Draw ();


 Круг (int atx, int aty, int theRadius);

 встроенный виртуальный ~ Circle ();

 виртуальная пустота Draw ();


Думайте о классе Circle как о классе Point с дополнительным членом (радиусом). Он наследует функции-члены базового класса и частные переменные Икс и Y.

Он не может назначать или использовать их, кроме как неявно, потому что они являются частными, поэтому он должен делать это через список инициализатора конструктора Circle. Это то, что вы должны принять, как есть сейчас. Я вернусь к спискам инициализаторов в следующем уроке.

В конструкторе круга, перед theRadius назначен на радиусчасть Point в Circle создается посредством вызова конструктора Point в списке инициализатора. Этот список - все, что находится между: и {ниже.

 Circle:: Circle (int atx, int aty, int theRadius): точка (atx, aty) 


Кстати, инициализация типа конструктора может использоваться для всех встроенных типов.

 int a1 (10);

 int a2 = 10;


Оба делают то же самое.

07

из 09

Что такое полиморфизм?

Полиморфизм - это общий термин, который означает «много форм». В C ++ наиболее простой формой полиморфизма является перегрузка функций. Например, несколько функций, называемых SortArray (arraytype) где sortarray может быть массив из целых или двойники.

Однако нас интересует только форма ООП полиморфизма. Это делается путем создания функции (например, Draw ()) виртуальный в базовом классе Point, а затем переопределить его в производный класс Круг.

Хотя функция Привлечь() является виртуальным в производном классе Кругэто на самом деле не нужно - это просто напоминание мне, что это виртуально. Если функция в производном классе соответствует виртуальной функции в базовом классе по именам и типам параметров, она автоматически становится виртуальной.

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

08

из 09

Конструкторы C ++

Конструкторы

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

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

Если конструктор не указан, компилятор создает конструктор по умолчанию без каких-либо параметров. Всегда должен быть конструктор, даже если он по умолчанию и пустой. Если вы предоставите конструктору параметры, то по умолчанию НЕ будет создано.

Несколько замечаний о конструкторах:

  • Конструкторы - это просто функции с тем же именем, что и класс.
  • Конструкторы предназначены для инициализации членов класса при создании экземпляра этого класса.
  • Конструкторы не вызываются напрямую (кроме как через списки инициализаторов)
  • Конструкторы никогда не бывают виртуальными.
  • Можно определить несколько конструкторов для одного класса. Они должны иметь разные параметры, чтобы различать их.

Есть еще много чего узнать о конструкторах, например, конструкторах по умолчанию, присваивании и копировании конструкторов. Это будет обсуждаться на следующем уроке.

09

из 09

Приведение в порядок деструкторов C ++

Деструктор - это функция-член класса, которая имеет то же имя, что и конструктор (и класс), но с ~ (тильда) впереди.

 ~ Круг ();


Когда объект выходит из области видимости или реже уничтожается, вызывается его деструктор. Например, если объект имеет динамические переменные, такие как указатели, их необходимо освободить, и деструктор является подходящим местом.

В отличие от конструкторов, деструкторы могут и должны быть сделаны виртуальными, если у вас есть производные классы. в точка и Круг В примере с классами деструктор не нужен, так как не нужно выполнять очистку (он просто служит примером). Если бы были динамические переменные-члены (например, указатели) тогда те потребовали бы освобождения, чтобы предотвратить утечки памяти.

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

В нашем примере

 ~ Круг ();

тогда

 ~ Точка ();


Деструктор базовых классов называется последним.

Это завершает этот урок. На следующем уроке вы узнаете о конструкторах по умолчанию, конструкторах копирования и назначении.