Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// получить содержимое объекта myScreen
auto s = myScreen.*pdata;
Упражнение 19.11. В чем разница между обычным указателем на данные и указателем на переменную-член?
Упражнение 19.12. Определите указатель на член класса, способный указывать на член cursor
класса Screen
. Получите через этот указатель значение Screen::cursor
.
Упражнение 19.13. Определите тип, способный представить указатель на член bookNo
класса Sales_data
.
19.4.2. Указатели на функции-члены
Вполне можно также определить указатель, способный указывать на функцию-член класса. Подобно указателям на переменные-члены, самый простой способ создания указателя на функцию-член — это использовать ключевое слово auto
для автоматического выведения типа:
// указатель pmf способен указывать на функцию-член класса Screen,
// возвращающую тип char и не получающую никаких аргументов
auto pmf = &Screen::get_cursor;
Как и указатель на переменную-член, указатель на функцию-член объявляется с использованием синтаксиса имяКласса ::*
. Подобно любому другому указателю на функцию (см. раздел 6.7), указатель на функцию-член определяет тип возвращаемого значения и список типов параметров функции, на которую может указывать этот указатель. Если функция-член является константной (см. раздел 7.1.2) или ссылочной (см. раздел 13.6.3), следует также добавить квалификатор const
или квалификатор ссылки.
Подобно обычным указателям на функцию, если функция-член перегружена, следует явно указать, какая именно функция имеется в виду (см. раздел 6.7). Например, указатель на версию функции get()
с двумя параметрами можно объявить так:
char (Screen::*pmf2)(Screen::pos, Screen::pos) const;
pmf2 = &Screen::get;
Круглые скобки вокруг части Screen::*
в этом объявлении необходимы из-за приоритета. Без круглых скобок компилятор воспримет следующий код как (недопустимое) объявление функции:
// ошибка: у функции, не являющейся членом класса p, не может быть
// спецификатора const
char Screen::*p(Screen::pos, Screen::pos) const;
Это объявление пытается определить обычную функцию по имени p
, которая возвращает указатель на член класса Screen
типа char
. Поскольку объявляется обычная функция, за объявлением не может быть спецификатора const
.
В отличие от обычных указателей на функцию, нет никакого автоматического преобразования между функцией-членом и указателем на этот член:
// pmf указывает на член класса Screen, не получающий аргументов и
// возвращающий тип char
pmf = &Screen::get; // нужно явно использовать оператор обращения к
// адресу
pmf = Screen::get; // ошибка: нет преобразования в указатель для
// функций-членов
Как и при использовании указателя на переменную-член, для вызова функции-члена через указатель на член класса используются операторы .*
и - >*
:
Screen myScreen, *pScreen = &myScreen;
// вызов функции, на которую указывает указатель pmf объекта,
// на который указывает указатель pScreen
char c1 = (pScreen->*pmf)();
// передает аргументы 0, 0 версии функции get() с двумя параметрами
// объекта myScreen
char c2 = (myScreen.*pmf2)(0, 0);
Вызовы (myScreen->*pmf)()
и (pScreen.*pmf2)(0,0)
требуют круглых скобок, поскольку приоритет оператора вызова выше, чем приоритет оператора указателя на член класса.
Без круглых скобок вызов myScreen.*pmf()
был бы интерпретирован как myScreen.*(pmf())
.
Этот код требует вызвать функцию pmf()
и использовать ее возвращаемое значение как операнд оператора указателя на член класса ( .*
). Но pmf
— не функция, поэтому данный код ошибочен.
Из-за разницы приоритетов операторов вызова объявления указателей на функции-члены и вызовы через такие указатели должны использовать круглые скобки:
(С::*p)(parms)
и (obj.*p) (args)
.
Псевдонимы типа или typedef
(см. раздел 2.5.1) существенно облегчают чтение указателей на члены. Например, следующий код определяет псевдоним типа Action
как альтернативное имя для типа версии функции get()
с двумя параметрами:
// Action - тип, способный указывать на функцию-член класса Screen,
// возвращающую тип char и получающую два аргумента типа pos
using Action =
char (Screen::*)(Screen::pos, Screen::pos) const;
Action
— это другое имя для типа "указатель на константную функцию-член класса Screen
, получающую два параметра типа pos
и возвращающую тип char
". Используя этот псевдоним, можно упростить определение указателя на функцию get()
следующим образом:
Action get = &Screen::get; // get указывает на член get() класса Screen
Подобно любым другим указателям на функцию, тип указателя на функцию-член можно использовать как тип возвращаемого значения или как тип параметра функции. Подобно любому другому параметру, у параметра указателя на член класса может быть аргумент по умолчанию:
// action() получает ссылку на класс Screen и указатель на его
// функцию-член
Screen& action(Screen&, Action = &Screen::get);
Функция action()
получает два параметра, которые являются ссылками на объект класса Screen
, и указатель на функцию-член класса Screen
, получающую два параметра типа pos
и возвращающую тип char
. Функцию action()
можно вызвать, передав ей указатель или адрес соответствующей функции-члена класса Screen
:
Screen myScreen;
// эквивалентные вызовы:
action(myScreen); // использует аргумент по умолчанию
action(myScreen, get); // использует предварительно определенную
// переменную get
action(myScreen, &Screen::get); // передает адрес явно
Псевдонимы типа облегчают чтение и написание кода, использующего указатели.
Как правило, перед использованием указатели на функции и указатели на функции-члены хранят в таблице функций (см. раздел 14.8.3). Когда у класса есть несколько членов того же типа, такая таблица применяется для выбора одного из набора этих членов. Предположим, что класс Screen дополнен несколькими функциями-членами, каждая из которых перемещает курсор в определенном направлении:
Читать дальшеИнтервал:
Закладка: