newf(uc); //
У перечисления Tokens
только два перечислителя, больший из них имеет значение 129
. Это значение может быть представлено типом unsigned char
, и большинство компиляторов будут использовать для перечисления Tokens
базовый тип unsigned char
. Независимо от своего базового типа, объекты и перечислители перечисления Tokens
преобразуются в тип int
. Перечислители и значения перечислимого типа не преобразуются в тип unsigned char
, даже если ему соответствуют значения перечислителей.
19.4. Указатель на член класса
Тип указателя на член класса объединяет тип класса и тип члена этого класса. Такие указатели инициализируют как указывающие на определенный член класса, не указывая объект, которому принадлежит этот член. При применении указателя на член класса предоставляется объект, член класса которого предстоит использовать.
Для демонстрации работы указателей на члены класса воспользуемся упрощенной версией класса Screen
из раздела 7.3.1:
class Screen {
public:
typedef std::string::size_type pos;
char get_cursor() const { return contents[cursor]; }
char get() const;
char get(pos ht, pos wd) const;
private:
std::string contents;
pos cursor;
pos height, width;
};
19.4.1. Указатели на переменные-члены
Подобно любым указателям, при объявлении указателя на член класса используется символ *
, означающий, что объявляемое имя является указателем. В отличие от обычных указателей, указатель на член класса включает также имя класса, содержащего этот член. Следовательно, символу *
должна предшествовать часть
, означающая, что определяемый указатель способен указывать на член класса
. Например:
//
//
const string Screen::*pdata;
Приведенный выше код объявляет pdata
"указателем на член класса Screen
, обладающий типом const string
". Переменные-члены константного объекта сами являются константами. Объявление указателя pdata
как указателя на тип const string
позволяет использовать его для указания на член любого объекта класса Screen
, константного или нет. Взамен указатель pdata
применим только для чтения, но не для записи в член класса, на который он указывает.
При инициализации (или присвоении) указателя на член класса следует заявить, на который член он указывает. Например, можно заставить указать pdata
указывать на переменную-член contents
неопределенного объекта класса Screen
следующим образом:
pdata = &Screen::contents;
Здесь оператор обращения к адресу применяется не к объекту в памяти, а к члену класса Screen
.
Конечно, по новому стандарту проще объявить указатель на член класса при помощи ключевых слов auto
или decltype
:
auto pdata = &Screen::contents;
Важно понять, что при инициализации или присвоении указателя на член класса он еще не указывает на данные. Он идентифицирует определенный член класса, но не содержащий его объект. Объект предоставляется при обращении к значению указателя на член класса.
Подобно .
и ->
, существуют два оператора доступа к указателю на член класса, .*
и ->*
, позволяющие предоставить объект и обращаться к значению указателя для доступа к члену этого объекта:
Screen myScreen, *pScreen = &myScreen
//
// объекта класса myScreen
auto s = myScreen.*pdata;
//
//
s = pScreen->*pdata;