- •Классы и заголовочные файлы Отделение объявления от реализации
- •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 () {
Something::getSomething();
return 0;
}
Результат выполнения программы:
o a u i e
При определении статического члена s_initializer вызовется конструктор по умолчанию _nested () (так как s_initializer является объектом класса _nested).
Мы можем использовать этот конструктор для инициализации любых статических переменных-членов класса Something. Самое крутое здесь — это то, что весь код инициализации скрыт внутри исходного класса со статическим членом.
Заключение
Статические методы могут использоваться для работы со статическими переменными-членами класса. Для работы с ними не требуется создавать объекты класса.
Классы могут быть «чисто статические» (со всеми статическими переменными-членами и статическими методами).
Однако, такие классы, по сути, эквивалентны объявлению функций и переменных в глобальной области видимости, и этого следует избегать, если у вас нет на это веских причин.
Дружественные функции и классы
Дружественная функция — это функция, которая имеет доступ к закрытым членам класса, как если бы она сама была членом этого класса.
Во всех других отношениях дружественная функция является обычной функцией.
Ею может быть, как обычная функция, так и метод другого класса.
Для объявления дружественной функции используется
ключевое слово friend перед прототипом функции, которую вы хотите сделать дружественной классу.
Неважно, объявляете ли вы её в public- или в private-зоне класса. Например:
class Anything {
private:
Int m_value;
public:
Anything () {m_value = 0;}
void add (int value) {m_value += value;}
// Делаем функцию reset () дружественной классу Anything
friend void reset (Anything &anything);
};
// Функция reset () теперь является другом класса Anything
Void reset (Anything &anything) {
// И мы имеем доступ к закрытым членам объектов класса Anything
anything.m_value = 0;
}
Int main () {
Anything one;
one.add (4); // добавляем 4 к m_value
reset(one); // сбрасываем m_value в 0
return 0;
}
Здесь мы объявили функцию reset (), которая принимает объект класса Anything и устанавливает m_value значение 0.
Поскольку reset() не является членом класса Anything, то в обычной ситуации функция reset() не имела бы доступ к закрытым членам Anything.
Однако, поскольку эта функция является дружественной классу Anything, она имеет доступ к закрытым членам Anything.
Обратите внимание, мы должны передавать объект Anything в функцию reset () в качестве параметра.
Это связано с тем, что функция reset () не является методом класса.
Она не имеет указателя this и, кроме как передачи объекта, она не сможет взаимодействовать с классом.
Еще один пример:
class Something {
private:
Int m_value;
public:
Something (int value) {m_value = value;}
friend bool isEqual (const Something &value1, const Something &value2);
};
bool isEqual (const Something &value1, const Something &value2){
return (value1.m_value == value2.m_value);
}
Здесь мы объявили функцию isEqual () дружественной классу Something.
Функция isEqual () принимает в качестве параметров два объекта класса Something.
Поскольку isEqual () является другом класса Something, то функция имеет доступ ко всем закрытым членам объектов класса Something.
Функция isEqual () сравнивает значения переменных-членов двух объектов и возвращает true, если они равны.
