Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
По исчерпании ввода следует не забыть вывести данные последней транзакции. Для этого после цикла while
используется еще один вызов функции print()
.
Упражнение 7.1. Напишите версию программы обработки транзакций из раздела 1.6 с использованием класса Sales_data
, созданного для упражнений в разделе 2.6.1.
7.1.2. Определение пересмотренного класса
Sales_data
У пересмотренного класса будут те же переменные-члены, что и у версии, определенной в разделе 2.6.1: член типа string
по имени bookNo
, представляющий ISBN, член типа unsigned
по имени units_sold
, представляющий количество проданных экземпляров книги, и член типа double
по имени revenue
, представляющий общий доход от этих продаж.
Как уже упоминалось, у класса будут также две функции-члена, combine()
и isbn()
. Кроме того, предоставим классу Sales_data
другую функцию-член, чтобы возвращать среднюю цену, по которой были проданы книги. Эта функция, назовем ее avg_price()
, не предназначена для общего использования. Она будет частью реализации, а не интерфейса.
Функции-члены определяют (см. раздел 6.1) и объявляют (см. раздел 6.1.2) как обычные функции. Функции-члены должны быть объявлены в классе, но определены они могут быть непосредственно в классе или вне тела класса. Функции, не являющиеся членами класса, но являющиеся частью интерфейса, как функции add()
, read()
и print()
, объявляются и определяются вне класса.
С учетом вышеизложенного напишем пересмотренную версию класса Sales_data
:
struct Sales_data {
// новые члены: операции с объектами класса Sales_data
std::string isbn() const { return bookNo; }
Sales_data& combine(const Sales_data&);
double avg_price() const;
// те же переменные-члены, что и в p. 2.6.1
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
// функции интерфейса класса Sales_data, не являющиеся его членами
Sales_data add(const Sales_data&, const Sales_data&);
std::ostream &print(std::ostream&, const Sales_data&);
std::istream &read(std::istream&, Sales_data&);
Функции, определенные в классе, неявно являются встраиваемыми (см. раздел 6.5.2).
Хотя каждый член класса должен быть объявлен в самом классе, тело функции-члена можно определить либо в, либо вне тела класса. Функция isbn()
определяется в классе Sales_data
, а функции combine()
и avg_price()
вне его.
Сначала рассмотрим функцию isbn()
, возвращающую строку и имеющую пустой список параметров:
std::string isbn() const { return bookNo; }
Как и у любой функции, тело функции-члена является блоком. В данном случае блок содержит один оператор return
, возвращающий значение переменной-члена bookNo
объекта класса Sales_data
. Интересно, как эта функция получает объект, член bookNo
которого следует выбрать?
this
Давайте снова рассмотрим вызов функции-члена isbn()
:
total.isbn()
Здесь для вызова функции-члена isbn()
объекта total
используется точечный оператор (см. раздел 4.6).
За одним исключением, рассматриваемым в разделе 7.6, вызов функции-члена осуществляется от имени объекта. Когда функция isbn()
обращается к члену класса Sales_data
(например, bookNo
), она неявно обращается к членам того объекта, из которого была вызвана. В этом вызове функции isbn()
, когда она возвращает значение члена bookNo
, речь идет о члене total.bookNo
.
Функция-член способна обратиться к тому объекту, из которого она была вызвана, благодаря дополнительному неявному параметру this. Когда происходит вызов функции-члена, указатель this
инициализируется адресом объекта, из которого была вызвана функция. Рассмотрим следующий вызов:
total.isbn()
Здесь компилятор присваивает адрес объекта total
указателю this
и неявно передает его как параметр функции isbn()
. Компилятор как бы переписывает этот вызов так:
// псевдокод, в который преобразуется вызов функции-члена
Sales_data::isbn(&total)
Этот код вызывает функцию-член isbn()
класса Sales_data
, передав адрес объекта total
.
В функции-члене можно обратиться непосредственно к членам объекта, из которого она была вызвана. Для использования членов объекта, на который указывает указатель this
, можно не использовать оператор доступа к члену. Любое непосредственное использование члена класса подразумевает использование указателя this
. Таким образом, когда функция isbn()
использует переменную bookNo
, она неявно использует член объекта, на который указывает указатель this
. Это аналогично синтаксису this->bookNo
.
Параметр this
определяется неявно и автоматически. Кроме того, определить параметр или переменную по имени this
самому нельзя, но в теле функции-члена его использовать можно. Вполне допустимо, хоть и не нужно, определить функцию isbn()
так:
std::string isbn() const { return this->bookNo; }
Поскольку указатель this
всегда предназначен для обращения к "этому" объекту, он является константным (см. раздел 2.4.2). Нельзя изменить адрес, хранящийся в указателе this
.
Еще одним важным моментом функции-члена isbn()
является ключевое слово const
, расположенное за списком параметров. Оно применяется для модификации типа неявного указателя this
.
По умолчанию указатель this
имеет тип константного указателя на неконстантную версию типа класса. Например, типом по умолчанию указателя this
в функции-члене Sales_data
является Sales_data *const
. Хоть указатель this
и неявен, он подчиняется обычным правилам инициализации, согласно которым (по умолчанию) нельзя связать указатель this
с константным объектом (см. раздел 2.4.2). Следствием этого факта, в свою очередь, является невозможность вызвать обычную функцию-член для константного объекта.
Если бы функция isbn()
была обычной и если бы указатель this
был обычным параметром типа указателя, то мы объявили бы его как const Sales_data *const
. В конце концов, тело функции isbn()
не изменяет объект, на который указывает указатель this
; таким образом, эта функция стала бы гибче, если бы указатель this
был указателем на константу (см. раздел 6.2.3).
Однако указатель this неявный и не присутствует в списке параметров, поэтому нет места, где можно было бы указать, что он должен быть указателем на константу. Язык решает эту проблему, позволяя разместить ключевое слово const
после списка параметров функции-члена. Это означает, что указатель this
является указателем на константу. Функции-члены, использующие ключевое слово const
таким образом, являются константными функциями-членами (const member function).
Интервал:
Закладка: