Перечислители и значения перечислений неявно преобразовываются в целые числа, но целые числа не преобразовываются в типы перечислений неявно.
int x = green; // OK: неявное преобразование Color в int
Color c = green; // OK
c = 2; // ошибка: нет неявного преобразования
// int в Color
c = Color(2); // OK: (непроверяемое) явное преобразование
int y = c; // OK: неявное преобразование Color в int
Использование перечислений обсуждается в разделе 9.5.
A.12. Классы
class X {
public:
// пользовательский интерфейс
private:
// реализация
};
Переменные, функции и типы, определенные в объявлении класса, называются
A.12.1. Доступ к членам класса
Открытый член класса доступен для пользователей; закрытый член класса доступен только членам класса.
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