static const позволяет инициализировать значения членов класса прямо в его объявлении:
class cClass
{
private:
static const int i = 2; // Инициализировали значение прямо в объявлении класса
public:
cClass() {};
~cClass() {};
int GetI() { return i; };
};
Методы класса
Методы класса, если объявить их как const, будут считать константой this. Это значит что они не смогут менять значения переменных класса.
class cClass
{
private:
int i;
public:
cClass(int a) {}
void Function() const
{
i = 5; // Не работает, т.к. this считается константой
}
};
Вы можете создавать константные методы класса, чтобы уберечь переменные класса от изменения его методами, но имейте в виду что конструктор и деструктор нельзя сделать константными.
Перегрузка методов класса
Напишем класс с двумя одноименными методами, один из которых сделаем const:
class cClass
{
private:
int i;
public:
cClass(int a)
{
i = a;
cout << "Constructor makes x = " << i << endl;
}
void Function()
{
cout << "f() tell x = " << i << endl;
}
void Function() const
{
cout << "f() const tell x = " << i << endl;
}
};
Теперь создадим 2 экземпляра класса — Class и Class2, при этом Class2 сделаем const:
|
|
int main()
{
cClass Class(3);
Class.Function();
cClass const Class2(3);
Class2.Function();
char gg[20];
scanf(gg, 20);
return 0;
}
Запустив программу, посмотрим какой метод будет вызваться для каждого из них:
Constructor makes x = 3
f() tell x = 3
Constructor makes x = 3
f() const tell x = 3
Очевидно что константный объект вызвал константный же метод, а наоборот - обычный объект вызвал обычным метод. Т.о. const можно использовать для перегрузки методов класса, необходимо только учитывать — при отсутствии не-const методов, по умолчанию будут использоваться const-методы.