Программирование. Принципы и практика использования C++ Исправленное издание, стр. 415
A.12.1. Доступ к членам класса
Открытый член класса доступен для пользователей; закрытый член класса доступен только членам класса.
class Date {public: // ... int next_day();private: int y, m, d;};void Date::next_day() { return d+1; } // OKvoid f(Date d){ int nd = d.d+1; // ошибка: Date::d — закрытый член класса // ...}Структура — это класс, члены которого по умолчанию являются открытыми.
struct S { // члены (открытые, если явно не объявлены закрытыми)};Более подробная информация о доступе к членам класса, включая обсуждение защищенных членов, приведена в разделе 14.3.4.
К членам объекта можно обращаться с помощью оператора
.–>struct Date { int d, m, y; int day() const { return d; } // определенный в классе int month() const; // просто объявленный; определен // в другом месте int year() const; // просто объявленный; определен // в другом месте};Date x;x.d = 15; // доступ через переменнуюint y = x.day(); // вызов через переменнуюDate* p = &x;p–>m = 7; // доступ через указательint z = p–>month(); // вызов через указательНа члены класса можно ссылаться с помощью оператора
::int Date::year() const { return y; } // определение за пределами // классаВ функциях-членах класса можно ссылаться на другие члены класса, не указывая имя класса.
struct Date { int d, m, y; int day() const { return d; } // ...};Такие имена относятся к объекту, из которого вызвана функция:
void f(Date d1, Date d2){ d1.day(); // обращается к члену d1.d d2.day(); // обращается к члену d2.d // ...}A.12.1.1. Указатель this
Если хотите явно сослаться на объект, из которого вызвана функция-член, то можете использовать зарезервированный указатель
thisstruct Date { int d, m, y; int month() const { return this–>m; } // ...};Функция-член, объявленная с помощью спецификатора
conststruct Date { int d, m, y; int month() const { ++m; } // ошибка: month() — константная // функция // ...};Более подробная информация о константных функциях-членах изложена в разделе 9.7.4.
A.12.1.2. Друзья
Функция, не являющаяся членом класса, может получить доступ ко всем членам класса, если ее объявить с помощью ключевого слова
friend// требует доступа к членам классов Matrix и Vector members:Vector operator*(const Matrix&, const Vector&);class Vector { friend Vector operator*(const Matrix&, const Vector&); // есть доступ // ...};class Matrix { friend Vector operator*(const Matrix&, const Vector&); // есть доступ // ...};Как показано выше, обычно это относится к функциям, которым нужен доступ к двум классам. Другое предназначение ключевого слова
friendclass Iter {public: int distance_to(const iter& a) const; friend int difference(const Iter& a, const Iter& b); // ...};