- •Классы и заголовочные файлы Отделение объявления от реализации
- •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 main () {
Anything anything;
anything.getValue () = "Hello!"; // вызывается неконстантный
// getValue ()
const Anything anything2;
anything2.getValue(); // вызывается константный getValue ()
return 0;
}
Перегрузка метода и разделение его на константную и неконстантную версии обычно выполняется, когда возвращаемое значение должно отличаться по константности (когда требуется константа, и когда она не требуется).
В примере, приведенном выше, неконстантная версия getValue () будет работать только с неконстантными объектами, но эта версия более гибкая, так как мы можем использовать её как для чтения, так и для записи m_value (что мы, собственно, и делаем, присваивая строку Hello!).
Но, когда мы не изменяем данные объекта класса, тогда вызывается константная версия getValue ().
Заключение
Любой метод, который не изменяет данные объекта класса, должен быть const!
Статические переменные-члены класса
Рассмотрим использование статических переменных-членов класса в языке С++.
Статические переменные-члены класса
Мы знаем, что статические переменные сохраняют свои значения и не уничтожаются даже после выхода из блока, в котором они объявлены, например:
#include <iostream>
Int generateId () {
static int s_id = 0;
return ++s_id;
}
Int main () {
std::cout << generateID () << '\n';
std::cout << generateID () << '\n';
std::cout << generateID () << '\n';
return 0;
}
Результат выполнения программы:
1
2
3
Обратите внимание, s_id сохраняет свое значение после каждого вызова функции generateID ().
Ключевое слово static имеет другое значение, когда речь идет о глобальных переменных — оно предоставляет им внутреннюю связь (что ограничивает их видимость/использование за пределами файла, в котором они определены).
Поскольку использование глобальных переменных — это зло, то ключевое слово static в этом контексте используется не очень часто.
В языке C++ ключевое слово static можно использовать в классах: статические переменные-члены и статические методы.
Прежде чем мы перейдем к ключевому слову static с переменными-членами класса, давайте сначала рассмотрим следующий класс:
#include <iostream>
class Anything {
public:
int m_value = 3;
};
Int main () {
Anything first;
Anything second;
first.m_value = 4;
std::cout << first.m_value << '\n';
std::cout << second.m_value << '\n';
return 0;
}
При создании объекта класса, каждый объект получает свою собственную копию всех переменных-членов класса.
В этом случае, поскольку мы объявили два объекта класса Anything, у нас будет две копии m_value: first.m_value и second.m_value.
Это разные значения, следовательно, результат выполнения программы:
4 3
Переменные-члены класса можно сделать статическими, используя ключевое слово static. В отличие от обычных переменных-членов, статические переменные-члены являются общими для всех объектов класса. Рассмотрим следующую программу:
#include <iostream>
class Anything {
public:
static int s_value;
};
int Anything::s_value = 3;
