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;}