- •Классы и заголовочные файлы Отделение объявления от реализации
- •Int m_month;
- •Int m_year;
- •Int getValue () { return m_value ; }
- •Int getValue () {return m_value;}
- •Классы и заголовочные файлы
- •Int getDay () {return m_day;}
- •Void Date::SetDate (int day, int month, int year) {
- •Параметры по умолчанию
- •Библиотеки
- •Заключение
- •Классы и const
- •Константные объекты классов
- •Int m_value;
- •Int getValue () { return m_value ; }
- •Int main () {
- •Константные методы классов
- •Int m_value;
- •Int m_value;
- •Int m_value;
- •Константные ссылки и классы
- •Int getDay () {return m_day;}
- •Void printDate (const Date &date) {
- •Int main () {
- •Int m_month;
- •Int m_year;
- •Void setDate (int day, int month, int year) {
- •Перегрузка константных и неконстантных функций
- •Int main () {
- •Статические переменные-члены класса
- •Статические переменные-члены класса
- •Int generateId () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Статические члены не связаны с объектами класса
- •Int main () {
- •Определение и инициализация статических переменных-членов класса
- •Инициализация статических переменных-членов внутри тела класса
- •Использование статических переменных-членов класса
- •Int getId() const { return m_id; }
- •Int main () {
- •Статические методы класса
- •Int main () {
- •Int main () {
- •Статические методы не имеют указателя this
- •Int main () {
- •Предупреждение о классах со всеми статическими членами
- •Int main () {
- •Дружественные функции и классы
- •Int m_value;
- •Void reset (Anything &anything) {
- •Int main () {
- •Int m_value;
- •Дружественные функции и несколько классов
- •Дружественные классы
- •Примечания о дружественных классах:
- •Дружественные методы
- •If (m_displayIntFirst)
- •Int m_intValue;
- •Values (int intValue, double dValue) {
- •Анонимные объекты
- •Int main () {
- •Анонимные объекты класса
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Int m_dollars;
- •Int getDollars() const { return m_dollars; }
- •Int main () {
- •Вложенные типы данных в классах
- •Int main () {
- •Вложенные пользовательские типы данных в классах
- •Int main () {
- •Другие вложенные пользовательские типы данных в классах
Int m_value;
Anything (): m_value (0) { }
void setValue (int value) { m_value = value; }
Int getValue () { return m_value ; }
};
Int main () {
const Anything anything; // вызываем конструктор по умолчанию
anything.m_value = 7; // ошибка компиляции: нарушение const
anything.setValue (7); // ошибка компиляции: нарушение const
return 0;
}
2 строки вызовут ошибки компиляции, так как они нарушают принципы константности объекта, пытаясь напрямую изменить переменную-член и вызывая сеттер для изменения значения переменной-члена.
Константные методы классов
Теперь рассмотрим следующую строку кода:
std::cout << anything.getValue ();
Удивительно, но это также вызовет ошибку компиляции, хотя метод getValue () не делает ничего для изменения переменной-члена!
Оказывается, что константные объекты класса могут явно вызывать только константные методы класса, а getValue () не указан, как константный метод.
Константный метод — это метод, который гарантирует, что не будет изменять объект или вызывать неконстантные методы класса (поскольку они могут изменить объект).
Чтобы сделать getValue() константным, нужно просто добавить ключевое слово const к прототипу функции после списка параметров, но перед телом функции:
class Anything {
public:
Int m_value;
Anything () {m_value= 0;}
void resetValue () {m_value = 0;}
void setValue (int value) {m_value = value;}
int getValue () const {return m_value;} // ключевое слово const //находится после списка параметров, но перед телом функции
};
Теперь getValue () является константным методом. Это означает, что мы можем вызывать его через любой константный объект.
Для методов, определенных вне тела класса, ключевое слово const должно использоваться как в прототипе функции (в теле класса), так и в определении функции:
class Anything {
public:
Int m_value;
Anything () {m_value= 0;}
void resetValue () {m_value = 0;}
void setValue (int value) {m_value = value;}
int getValue () const; // обратите внимание на ключевое слово const
};
int Anything::getValue () const { // и здесь
return m_value;
}
Кроме того, любой константный метод, который пытается изменить переменную-член или вызвать неконстантный метод класса, также приведет к ошибке компиляции, например:
class Anything {
public:
Int m_value;
void resetValue () const {m_value = 0;} // ошибка компиляции, /константные методы не могут изменять переменные-члены класса
};
В этом примере метод resetValue () был установлен константным, но он пытается изменить значение m_value. Это вызовет ошибку компиляции.
Обратите внимание, конструкторы не могут быть константными!
Это связано с тем, что они должны иметь возможность инициализировать переменные-члены класса, а константный конструктор этого не может сделать.
Следовательно, в языке С++ константные конструкторы запрещены. Метить, что константный объект класса может вызывать будет их инициализировать вообще!
Правило: Делайте все ваши методы, которые не изменяют данные объекта класса, константными.
