Открытый член класса доступен для пользователей; закрытый член класса доступен только членам класса.
class Date {
public:
// ...
int next_day();
private:
int y, m, d;
};
void Date::next_day() { return d+1; } // OK
void 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
Если хотите явно сослаться на объект, из которого вызвана функция-член, то можете использовать зарезервированный указатель this
.
struct Date {
int d, m, y;
int month() const { return this–>m; }
// ...
};
Функция-член, объявленная с помощью спецификатора const
(константная функция-член), не может изменять значение члена объекта, из которого она вызвана.
struct 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&); // есть доступ
// ...
};
Как показано выше, обычно это относится к функциям, которым нужен доступ к двум классам. Другое предназначение ключевого слова friend
— обеспечивать функцию доступа, которую нельзя вызывать как функцию-член.
class Iter {
public:
int distance_to(const iter& a) const;
friend int difference(const Iter& a, const Iter& b);
// ...
};
void f(Iter& p, Iter& q)
{
int x = p.distance_to(q); // вызов функции-члена
int y = difference(p,q); // вызов с помощью математического
// синтаксиса
// ...
}
Отметим, что функцию, объявленную с помощью ключевого слова friend
, нельзя объявлять виртуальной.
A.12.2. Определения членов класса