C++. Введение в классы и объекты. Конструкторы и деструкторы, страница 4

  • На основе класса в программе создаются экземпляры этого класса (объекты).
  • В зависимости от способа создания объекта (выделения памяти под объект) объекты могут быть статическими и динамическими.
  • Под статические объекты память отводит компилятор в стеке или глобальной области памяти, а под динамические объекты – программист с использованием операции динамического выделения памяти (new). Память под динамические объекты отводится в динамической области памяти (куче, heap).
  • Если поля и методы объявлены в секции public, то к ним разрешен доступ за пределами класса любым функциям программы с использованием имени объекта и операций точка или стрелка ( точка – используется для статических объектов, а стрелка – для динамических объектов).
  • Для доступа за пределами класса к значениям закрытых полей данных (объявленных в секции private) используют public методы доступа:
    • методы записи (изменения значения поля). Имена этих методов рекомендуют начинать с set;
    • методы чтения (получения значения поля). Имена этих методов рекомендуют начинать с get;
  • При создании объекта класса, пространство в памяти отводится только под поля объекта. Для методов память при создании объекта не резервируется. Каждый метод класса существует в памяти в единственном экземпляре и может работать с полями данных каждого объекта класса. Для этого каждый метод класса, кроме статических методов, (методов объявленных в классе с ключевым словом static) имеет скрытый параметр – указатель this, в который передается адрес объекта, который вызывает метод. Указатель this неявно применяется для доступа к полям объекта из методов объекта. Но при желании можно явно применить указатель this для доступа к полям объекта из методов объекта, особенно если параметры метода совпадают по именам с полями объекта.

25.11.2016

17

  • Пример 2. Создание объектов класса Cat. Доступ к полям и методам
  • // main.cpp
  • #include "cat.h"
  • int main()
  • { Cat Cat1; //статический объект, вызывается
  • // конструктор без параметров
  • Cat Cat2("Murzik",3); //статический объект,
  • // вызывается конструктор c параметрами
  • Cat* Cat3 = new Cat; //динамический объект
  • Cat* Cat4 = new Cat("Pushok",4); //динамический объект
  • Cat1.Meow(); Cat2.Meow();
  • Cat3->Meow(); Cat4->Meow();
  • // Cat1.age = 5; Ошибка!!!
  • Cat2.setAge(5);//Правильно!!!
  • Cat4->setAge(6);
  • cout << "\n" << "\n" ;
  • Cat2.Meow(); Cat4->Meow();
  • delete Cat3; delete Cat4;
  • }

25.11.2016

18

  • Состав проекта и пример выполнения программы примера 2:

25.11.2016

19

Способы создания массива объектов 1. Cat Family1[5]; //статический массив объектов // класса Cat - для каждого //объекта вызывается конструктор без параметров 2. Cat * Family2; Family2 = new Cat[5]; //динамический массив // объектов класса Cat - для каждого объекта // вызывается конструктор без параметров 3. Cat * Family3[5]; //массив указателей на объекты // класса Cat for (int i=0; i < 5; i++) Family3[i] = new Cat;

25.11.2016

20

  • Пример 3.
  • // main.cpp
  • #include "cat.h"
  • #include <iostream>
  • using namespace std;
  • int main()
  • { Cat Family1[5]; // статический массив объектов
  • for (int i=0; i < 5; i++)
  • Family1[i].setAge(2*i+1);
  • cout << " Возраст котов (в годах):";
  • for (int i=0; i < 5; i++)
  • cout << "\n Кот N "<< i+1 << " - " << Family1[i].getAge();
  • }

25.11.2016

21

  • Пример 4.
  • // main.cpp
  • #include "cat.h"
  • #include <iostream>
  • using namespace std;
  • int main()
  • {Cat* Family2 = new Cat[5]; // динамический массив объектов
  • for (int i=0; i < 5; i++)
  • Family2[i].setAge(2*i+2);
  • cout << " Возраст котов (в годах):";
  • for (int i=0; i < 5; i++)
  • cout << "\n Кот N "<< i+1 << " - " << Family2[i].getAge();
  • delete []Family2;
  • }