14. Статические методы класса
Особенности статических методов класса
172.50K
Категория: ПрограммированиеПрограммирование

Л8.Ч1. 1. Статические член-функции класса

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

Пусть имеется какой-то класс, имеющий статическое членданное типа private:
class Some
{int a, ID; double b;
static int count;
public:
Some(int A=0, double B=0)
{a=A; b=B; count++; ID=count;}
Print()
{cout<<"a="<<a<<" b="<<b<<" ID="<<ID;}
…………..
};
int Some::Count=0;

2.

Изменение типа доступа к статическому член-данному не
влияет на его инициализацию.
Но получить доступ к ним из main напрямую (через имя
класса и оператор разрешения области видимости) или
через объект нельзя:
int main()
{ cout<<"count="<<Some::count<< endl;
//Неверно!! count – private
Some S1, S2(1, 2.2);
cout<<"S1: "; S1.Print();
cout<<" count="<<S1.count<< endl;
//Неверно!! count – private
return 0;
};

3.

Если член-данное имеет тип доступа private, то доступ
к нему из main можно получить только через publicметоды класса.
Можно создать обычный метод класса для работы со
статическими данными.
Например, в классе Some можно определить метод
int GetCount()
{return count;}
Но тогда пришлось бы создавать объект этого класса
для использования метода!

4.

Более удобный и лучший вариант – сделать метод,
работающий со статическими данными, статическим
Для объявления метода статическим используется
модификатор static, который располагается перед
типом возвращаемого значения функции.
Например, в классе Some определим метод
static int GetCount()
{return count;}

5.

Замечание. Статический метод в классе может быть
только объявлен.
Его определение может быть сделано вне класса.
При определении статического метода вне класса
модификатор static не указывается.
ПРИМЕР.
Объявление статического метода в классе:
static int GetCount();
Определение статического метода вне класса:
int Some::GetCount()
{return count;}

6. Особенности статических методов класса

1) Статические методы принадлежат классу, т.е.
существуют и работают даже если объекты класса
не созданы.
Поэтому их можно вызывать напрямую через имя
класса
и
оператор
разрешения
области
видимости, без создания объекта.
ПРИМЕР:
cout<<"count="<<Some::GetCount()<< endl;

7.

2) К статическому методу можно обратиться как к
обычному методу, через объект класса.
ПРИМЕР.
Some S1, S2(1, 2.2);
cout<<"count="<<S1.GetCount()<< endl;
Однако, такое обращение к статическим методам
не рекомендуется.

8.

3) Статические методы могут напрямую обращаться
к другим статическим членам (переменным или
функциям), но не могут напрямую обращаться к
нестатическим членам.
Это связано с тем, что нестатические члены
принадлежат объекту класса, а статические
методы – нет!
ПРИМЕР.
static int GetNextID()
{return ID+1;}
//ошибка! попытка
//использовать нестатические
// член-данные

9.

4) Статический
метод
может
работать
с
конкретными объектами.
Для этого объекты должны передаваться в метод
в качестве аргумента по ссылке или через
указатель
ПРИМЕР.
static int GetNextID(const Some &S)
{return S.ID+1;}

10.

Замечание. Классы могут быть «чисто статические» (со
всеми
статическими
переменными-членами и
статическими методами). Однако, у такого класса
имеются недостатки:
1) поскольку все статические члены создаются только
один раз, то нескольких копий «чисто статического
класса» не может быть (без клонирования класса и
его дальнейшего переименования);
2) «чисто статические классы», по сути, эквивалентны
объявлению функций и переменных в глобальной
области видимости, и, следовательно, имеют все
недостатки глобальных переменных.
Поэтому таких классов следует избегать, если у вас
нет на это веских причин.
English     Русский Правила