Статические и нестатические члены класса
Спецификатор класса памяти static может быть использован в объявлении данных и методов класса. Такие элементы называются статическими и имеют свойства, отличные от свойств нестатических элементов.
В случае обычных, нестатических элементов данных каждый объект содержит отдельную копию элемента. В отличие от этого, для статических элементов существует только одна копия, а доступ к ней может выполняться без ссылки на конкретный объект класса. Главное назначение статических элементов данных состоит в том, чтобы отслеживать данные, общие для всех объектов класса (например, число созданных объектов). Статические методы класса обычно применяются для того, чтобы получить доступ к закрытым (private, protected) статическим элементам данных. Если count – статический элемент данных класса Aclass, то на него можно ссылаться при помощи полного (квалифицированного имени)
Aclass::count
Даже если ни один объект класса Aclass еще не создан. Однако, сохраняется и обычный способ доступа
Aclass a;
a.count;
Aclass *b;
b->count;
Объявление статических членов-данных класса имеет одну важную особенность. Так как при описании класса, память для данных не выделяется, такие члены сначала должны быть объявлены внутри класса, а затем дополнительно инициализированы вне его, например:
class Aclass
{
static int count;
…
};
int Aclass::count=0;
Пример:
#include <iostream.h>
class Aclass
{
int n;
public:
static int count;
Aclass (int c=0)
{
n = c;
}
};
int Aclass::count=0;
void main()
{
cout<< Aclass::count<<endl;
Aclass::count++;
cout<< Aclass::count<<endl;
}
#include <iostream.h>
class Aclass
{
int n;
static int count;
public:
Aclass (int c=0)
{
n = c;
count++;
}
static int Getcount();
};
int Aclass::Getcount()
{
return count;
}
int Aclass::count=0;
void main()
{
cout<< Aclass::Getcount()<<endl;
Aclass a;
Aclass b;
cout<<Aclass::Getcount()<<endl;
cout<<a.Getcount()<<endl;
cout<<b.Getcount()<<endl;
}
Пример использования статического метода:
class A
{
private:
int x;
public:
A()
{
x=0;
}
A(int nx)
{
x=nx;
}
void Show()
{
cout<<x<<endl;
}
static void WMsg()
{
cout<<"Warning!!!"<<endl;
}
};
void main()
{
A::WMsg();
}