Статические методы класса

Статическими могут быть не только данные класса, но и методы. Ключевое слово static ставится перед типом функции-члена. Статические методы в основном используются для работы со статическими членами-данными класса.

Существуют следующие ограничения на статические методы:

Методы имеют прямой доступ лишь к статическим данным класса.

Указатель this не виден в статических методах, поэтому в их определении нельзя обратиться к нестатическим данным класса.

Невозможно объявить в классе статическую и нестатическую версии функции.

Статические методы не могут быть виртуальными и не могут быть константными.

Пример класса со статическими методами

#include <iostream>

using namespace std;

class C {

public:

// конструкторы и деструктор

C (char* s) { strcpy_s (m_s, 40, s);

incObj (); }

C ()   

{ m_s [ 0 ] = '\0'; incObj (); }

~C ()  

{ --objAmount; }

// открытые статические методы

static void initAmount (const int v) { objAmount = v; }

static int getAmount ()

{ return objAmount; }

private:

// закрытые статические метод и член-данное

       static int incObj () { return ++objAmount; }

       static int objAmount;

// закрытые нестатический метод и член-данное

       int lenS () 

       {return strlen (m_s); }

       char m_s [ 40 ];

};

// объявление статической переменной

int C:: objAmount;

// главная функция

int main ()

{

C:: initAmount (0);     // инициализация objAmount

// объявление и создание объектов

C o1 ("St. Petersburg"), о2 ("Yalta");

C о [ 12 ], о3;

C* р = new C [ 25 ];

// вывод состояния статической переменной

cout << C:: getAmount () << endl;    // выводится 40

// разрушение объектов

delete [ ] р;

// вывод состояния статической переменной

cout << C:: getAmount () << endl;    // выводится 15

return 0;

}

 

 

Для закрытой статической переменной objAmount класса с объявлены три статических метода, два из них являются открытыми, а один — закрытым. Член-данное objAmount используется для подсчета существую­щих в оперативной памяти объектов класса. Для инициализации objAmount целым значением реализован открытый статический метод initAmount (), для получения значения — getAmount (). Закрытый статический метод incObj () предназначен для увеличения на 1 значения статической пере­менной класса objAmount. Этот метод вызывается всеми конструкторами класса. Чтобы программа определяла правильно количество существующих объектов, в деструктор добавлен декремент objAmount.

До начала главной функции объявляется статическая переменная, которая инициализируется первым оператором main (), устанавливая для objAmount нулевое значение. При объявлении объектов ol, о2, оЗ класса с, массива о из 12 объектов и указателя р на массив из 25 объектов типа класса с одно­временной инициализацией автоматически вызываются конструкторы класса, внутри которых инкрементируется число созданных объектов objAmount. Вызов статической функции getAmount () возвращает значение 40, которое выводится. Оператор delete заставит работать деструктор класса, и 25 объ­ектов будут разрушены. Значение objAmount 25 раз уменьшится на 1, после чего повторный вызов getAmount () вернет значение 15.

В связи с тем, что областью видимости статических методов является класс, в котором они объявлены, при всех вызовах указывается оператор расшире­ния области видимости:

С:: initAmount (0); С:: getAmount ();

Если объявить статическую переменную класса objAmount открытой со специ­фикатором public, то можно получить значение без оператора области види­мости, используя любой объект программы. Например, все показанные далее операторы выведут значение objAmount на экран:

cout << р -> objAmount << endl;

cout << ol. objAmount << endl;

cout << о [ 2 ]. objAmount << endl;

cout << о [ 24 ]. objAmount << endl;

 

Объекты в качестве аргументов функций

В следующей нашей программе мы внесем улучшения в пример ENGL0BJ, а также продемонстрируем несколько новых аспектов создания классов: перегрузку кон­структоров, определение методов класса вне класса и, возможно, самое важное — использование объектов в качестве аргументов функций. Рассмотрим программу ENGLC0N:

// englcon.cpp

// constructors.adds objects using member function

#include <iostream>

using namespace std;

//////////////////////////////////////////////////////////

class Distance    // длина в английской системе

{

private:

       int feet;

       float inches;

public:       // конструктор без аргументов

       Distance(): feet(0),inches(0.0) { }

// конструктор с двумя аргументами

       Distance(int ft,float in): feet(ft),inches(in) { }

void getdist() // ввод длины пользователем

{

cout << "\nВведите число футов: ";

cin >> feet;

cout << "Введите число дюймов: ";

cin >> inches;

}

void showdist()   // вывод длины на экран

{ cout << feet << "\'-" << inches << "'\'"; }

void add_dist(Distance, Distance); // прототип

};

//                 --        

// сложение длин d2 и d3

void Distance::add_dist(Distance d2, Distance d3) {

inches = d2.inches + d3.inches; // сложение дюймов

feet =0;     //с возможным заемом

if(inches >= 12.0) // если число дюймов больше 12.0.

{      //то уменьшаем число дюймов

inches -= 12.0;    // на 12.0 и увеличиваем

feet++;      // число футов на 1

}

feet +=d2.feet + d3.feet; // сложение футов

}

//////////////////////////////////////////////////////////

int main()

{

       setlocale (LC_CTYPE, "rus");

Distance dist1, dist3;     // две длины

Distance dist2(11, 6.25); // определение и инициализация

dist1.getdist();      // ввод distl

dist3.add_dist(dist1,dist2); // dist3 = dist1 + dist2;

// вывод всех длин

cout << "\ndistl = ";

dist1.showdist();

cout << "\ndist2 = ";

dist2.showdist();

cout << "\ndist3 = ";

dist3.showdist();

cout << endl;

return 0;

}

 

Основной блок этой программы начинается с присвоения начальных значе­ний полям объекта dist2 класса Distance, после чего производится его сложение с экземпляром distl, инициализируемым пользователем. Затем на экран выво­дятся все три экземпляра класса Distance:

Введите число футов: 17

Введите число дюймов: 5.75

distl = 17'-5.75"

dist2 = 11’-6.25"

dist3 = 29'-0"

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: