Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 3-4n.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
74.69 Кб
Скачать

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, если они равны.