Похожие презентации:
Л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) «чисто статические классы», по сути, эквивалентны
объявлению функций и переменных в глобальной
области видимости, и, следовательно, имеют все
недостатки глобальных переменных.
Поэтому таких классов следует избегать, если у вас
нет на это веских причин.
Программирование