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

25.11.2016

22

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

25.11.2016

23

Примеры использования инициализаторов для инициализации объектов 1. Cat Family1[3] = { Cat("Пушок1", 3), Cat("Мурзик", 5), Cat("Пушок2", 2) }; 2. Cat* Family3[3] = { new Cat("Пушок1", 3), new Cat("Мурзик", 5), new Cat("Пушок2", 2) };

25.11.2016

24

Статические поля класса Пример 6 // main.cpp #include <iostream> using namespace std; class TPoint { double x,y; public: static int N; //количество точек TPoint(double x1=0.0,double y1=0.0) { N++; x = x1; y = y1;} }; int TPoint::N=0; //определение и инициализация статич. поля int main(void) { TPoint A(1.0,2.0); TPoint B(4.0,5.0); TPoint *C = new TPoint(7.0,8.0); cout << "Определены " << TPoint::N << " точки\n"; cout << "Определены " << A.N << " точки\n"; cout << "Определены " << C->N << " точки\n"; delete C;}

25

  • Cтатические поля класса объявляются внутри класса с использованием ключевого слова static. Специфика статических полей:
    • а) размещаются в памяти на стадии компиляции (когда еще не создано ни одного объекта!) независимо от того, где создается сам объект.
    • б) существуют в единственном экземпляре (то есть компилятор выделяет под нее память только один раз!) независимо от того, сколько создано объектов. Это означает, что для полей класса с ключевым словом static при создании объекта память не резервируется.
    • Статическое поле класса является общим для всех объектов этого класса. Необходимость в таких переменных продиктована рядом практических соображений, и их использование во многих случаях оправдано. Например, в программе нужно контролировать количество созданных на данный момент объектов определенного класса. В этом случае создается статическое поле класса, значение которого определяется количеством объектов в работе.
    • Для того чтобы компилятор отвел под статическую переменную место в памяти ее необходимо определить и инициализировать вне функций и вне объявления класса. Статические переменные независимо от спецификатора доступа определяются и инициализируются одинаково.
    • Статическая переменная класса по сути является глобальной, заключенной в пространство имен класса , поэтому к public статической переменной можно обращаться посредством имени класса и операции области видимости ( cout << TPoint::N). С другой стороны, формально статическая переменная является членом класса, поэтому ничто не мешает обращаться к ней посредством объекта: cout << A.N << C->N.
    • Обращение к статической переменной внутри методов класса для программиста ничем не отличается от обращения к обычной переменной, компилятор же подставляет обращение по адресу статической переменной, поэтому статические переменные никогда не должны инициализироваться в конструкторе.

26

Статические методы класса Пример 7 // main.cpp #include <iostream> using namespace std; class TPoint { double x,y; static int N;//количество точек public: TPoint(double x1=0.0,double y1=0.0) { N++; x = x1; y = y1;} static int& count(){return N;} }; int TPoint::N; //определение и инициализация // статического поля (по умолчанию 0) int main(void) { TPoint A(1.0,2.0); TPoint B(4.0,5.0); TPoint *C = new TPoint(7.0,8.0); cout << "Определены " << TPoint::count() << " точки\n"; delete C;}