Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
}
Здесь нет никакой необходимости в приведении аргументов перед применением. Оба они, и *this
и параметр, являются объектами класса Base
, поэтому все доступные для него функции содержатся в классе объекта.
19.2.4. Класс type_info
Точное определение класса type_info
зависит от компилятора, но стандарт гарантирует, что класс будет определен в заголовке typeinfo
и предоставлять, по крайней мере, те функции, которые перечислены в табл. 19.1.
Этот класс обладает также открытым виртуальным деструктором, поскольку он предназначен для использования в качестве базового класса. Если компилятор позволяет предоставить дополнительную информацию о типе, для этого следует воспользоваться классом, производным от класса type_info
.
Таблица 19.1. Функции класса type_info
t1 == t2 |
Возвращает значение true , если оба объекта ( t1 и t2 ) имеют тот же тип, и значение false — в противном случае |
t1 != t2 |
Возвращает значение true , если оба объекта ( t1 и t2 ) имеют разные типы, и значение false — в противном случае |
t.name() |
Возвращает символьную строку в стиле С, содержащую отображаемую версию имени типа. Имена типов создаются способом, не зависящим от системы |
t1.before(t2) |
Возвращает логическое значение (тип bool ), указывающее на то, следует ли тип t1 прежде типа t2 . Порядок следования зависит от компилятора |
У класса type_info
нет стандартного конструктора, а оператор присвоения, конструктор копий и перемещения определены как удаленные (см. раздел 13.1.6). Поэтому нельзя определять, копировать или присваивать объекты типа type_info
. Единственный способ создания объектов класса type_info
— это оператор typeid
.
Функция-член name()
возвращает символьную строку в стиле С, содержащую имя класса объекта. Значение, используемое для данного типа, зависит от компилятора и не обязательно соответствует имени класса, использованному в программе. Единственное, что гарантирует функция name()
, — это уникальность возвращаемой ей строки для данного типа.
Рассмотрим пример:
int arr[10];
Derived d;
Base *p = &d;
cout << typeid(42).name() << ", "
<< typeid(arr).name() << ", "
<< typeid(Sales_data).name() << ", "
<< typeid(std::string).name() << ", "
<< typeid(p).name() << " , "
<< typeid(*p).name() << endl;
При запуске на машине авторов эта программа выводит следующее
i, A10_i, 10Sales_data, Ss, P4Base, 7Derived
Класс
type_info
зависит от компилятора. Некоторые компиляторы предоставляют и другие функции-члены, которые возвращают дополнительную информацию о типах, используемых в программе. Чтобы выяснить реальные возможности класса type_info
для конкретного компилятора, необходимо обратиться к его документации.
Упражнение 19.9. Напишите программу, подобную приведенной в конце этого раздела, для вывода имен, используемых компилятором для общих типов. Если ваш компилятор создает вывод, подобный нашему, напишите функцию, которая преобразует эти строки в более понятную для человека форму.
Упражнение 19.10. С учетом приведенной ниже иерархии классов, в которой каждый класс обладает открытым стандартным конструктором и виртуальным деструктором, укажите, какие имена типов отобразят следующие операторы?
class A { /* ... */ };
class В : public A { /* ... */ };
class С : public В { /* ... */ };
(a) A *pa = new С;
cout << typeid(pa).name() << endl;
(b) С cobj;
A& ra = cobj;
cout << typeid(&ra).name() << endl;
(c) B *px = new B;
A& ra = *px;
cout << typeid(ra).name() << endl;
19.3. Перечисления
Перечисления (enumeration) позволяют группировать наборы целочисленных констант. Как и класс, каждое перечисление определяет новый тип. Перечисления — литеральные типы (см. раздел 7.5.6).
В языке С++ есть два вида перечислений: с ограниченной и с не ограниченной областью видимости. Перечисление с ограниченной областью видимости (scoped enumeration) вводит новый стандарт. Для определения перечисления с ограниченной областью видимости используются ключевые слова
enum class
(или enum struct
), сопровождаемые именем перечисления и разделяемым запятыми списком перечислителей (enumerator), заключенным в фигурные скобки. За закрывающей фигурной скобкой следует точка с запятой:
enum class open_modes {input, output, append};
Здесь определен тип перечисления open_modes
с тремя перечислителями: input
, output
и append
.
В определении перечисления с не ограниченной областью видимости (unscoped enumeration) ключевое слово class
(или struct
) отсутствует. Имя перечисления с не ограниченной областью видимости не является обязательным:
enum color {red, yellow, green}; // перечисление с не ограниченной
// областью видимости
// безымянное перечисление с не ограниченной областью видимости
enum {floatPrec = 6, doublePrec = 10, double_doublePrec = 10};
Если перечисление является безымянным, определить объекты его типа можно только в составе определения перечисления. Подобно определению класса, здесь можно предоставить разделяемый запятыми список объявлений между закрывающей фигурной скобкой и точкой с запятой, завершающей определение перечисления (см. раздел 2.6.1).
Имена перечислителей в перечислении с ограниченной областью видимости подчиняются обычным правилам областей видимости и недоступны вне области видимости перечисления. Имена перечислителей в перечислении с не ограниченной областью видимости находятся в той же области видимости, что и само перечисление:
enum color {red, yellow, green}; // перечисление с не ограниченной
// областью видимости
enum stoplight {red, yellow, green}; // ошибка: переопределение
// перечислителей
enum class peppers {red, yellow, green}; // ok: перечислители
// скрываются
color eyes = green; // ok: перечислители находятся в области видимости
// для перечисления с не ограниченной областью видимости
peppers p = green; // ошибка: перечислители из peppers не находятся в
// области видимости
Интервал:
Закладка: