Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Глава 25. ОБРАБОТКА ОШИБОК И ИСКЛЮЧЕНИЯ...290
Глава 26. МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ...298
Глава 27. ШАБЛОНЫ С++...308
Глава 28. СТАНДАРТНАЯ БИБЛИОТЕКА ШАБЛОНОВ...317
В этой части...
В этой книге не ставится цель сделать из вас профессионала в области С++, а всего лишь предполагается дать вам твёрдое понимание основ С++ и объектно-ориентированного программирования.
Освоив предыдущие части книги, вы приобрели самые необходимые знания по созданию качественной объектно-ориентированной программы. Конечно же, С++ весьма обширный и богатый разнообразными возможностями язык, и осталось ещё немало особенностей, которые требуют освещения. В этой части представлено краткое описание дополнительных и, по моему мнению, наиболее полезных возможностей языка, которые стоит использовать в первую очередь ( хотя это и не обязательно ).
ОГЛАВЛЕНИЕ
В этой главе...
►Сравнение операторов и функций 271
►Потоковые операторы 272
►Мелкое копирование — глубокие проблемы 272
►Переопределение оператора присвоения 273
►Защита от копирования 276
Встроенные ( intrinsic) типы данных — это типы данных, которые компилятор "знает" изначально, такие как int , float , double и другие, а также различные типы указателей. В главах 3, "Выполнение математических операций", и 4, "Выполнение логических операций", были описаны операторы, определённые в С++ для встроенных типов. С++ позволяет программисту определять операторы для создаваемых им классов в дополнение к встроенным операторам. Эта возможность называется перегрузкой операторов.
Обычно перегрузка операторов необязательна и не используется новичками в программировании на С++. Более того, многие опытные программисты вообще считают данную возможность излишней и опасной. Однако есть один оператор, который вы будете просто вынуждены переопределять: это оператор присвоения.
►Сравнение операторов и функций...271
Оператор представляет собой не более чем встроенную функцию с определённым синтаксисом. Так, сложение а+b можно рассматривать, как если бы это была запись operator+( a , b ) . С++ даёт каждому оператору имя в стиле функции. Такое функциональное имя оператора состоит из ключевого слова operator , за которым следует символ оператора, а за ним — соответствующие типы аргументов. Например, оператор + , который суммирует целые числа и возвращает целое число, имеет имя int operator+( int , int ) .
Любой оператор может быть определён для пользовательского класса. Так, я могу создать Complex operator*( Complex & , Complex &), который позволит мне умножить два объекта типа Complex . Новый оператор может иметь ту же семантику, что и перегружаемый, но не обязан. При перегрузке операторов действуют следующие правила.
■■■
■ Программист не может перегрузить операторы ., ::, *( разыменование ) и & .
■ Программист не может вводить новые операторы, например, х$у.
■ Формат оператора не может быть изменён. Например, вы не можете определить оператор %i, поскольку % — бинарный оператор.
■ Приоритет операторов не может быть изменён. Программа не может заставить оператор + выполняться раньше оператора *.
■ Операторы не могут быть переопределены для встроенных типов — вы не в состоянии изменить смысл записи 1+2. Существующие операторы могут быть перегружены только для вновь создаваемых типов.
■■■
Перегрузка операторов — одна из тех вещей, которые выглядят лучше, чем есть на самом деле. По моему опыту, перегрузка операторов создаёт больше проблем, чем решает, с двумя важными исключениями, которые будут рассмотрены далее в этой главе.
►Потоковые операторы...272
Операторы считывания из потока и записи в него, << и >> , — это не что иное, как переопределённые операторы левого и правого сдвига для набора классов, представляющих потоки ввода-вывода. Эти определения находятся в файле iostream . Таким образом, запись cout <<"some string" означает вызов функции operator<<( " some string" ) . Наши старые знакомые сin и cout представляют собой предопределённые объекты, связанные с клавиатурой и монитором соответственно. Подробнее мы поговорим об этом в главе 24, "Использование потоков ввода-вывода".
►Мелкое копирование — глубокие проблемы...272
Независимо от того, что думаете вы и многие другие о переопределении операторов, вам всё равно придётся переопределять оператор присвоения для множества ваших классов. С++ предоставляет определение operator=( ) по умолчанию, но этот оператор просто выполняет почленное копирование. Такое присвоение отлично работает для встроенных операторов типа int .
int i ;
i = 10 ;
Точно так же ведёт себя присвоение по умолчанию и для пользовательских классов. В следующем примере каждый член source копируется в соответствующий член destination .
void fn( )
{
MyStruct source , destination ;
destination = source ;
}
Оператор присвоения по умолчанию вполне работоспособен для большинства классов, однако при выделении ресурсов, таких как память из кучи, начинаются проблемы. В этом случае программист должен переопределить оператор operator=( ) для корректной передачи ресурса.
Оператор присвоения очень похож на конструктор копирования, а при использовании они практически идентичны.
void fn( MyClass & mc )
{
MyClass newMC( mc ) ; /* Здесь используется конструктор копирования */
MyClass newerMC = mc ; /* Менее очевидно, что здесь также используется конструктор копирования */
MyClass newestMC ; /* Создание объекта по умолчанию */
newestMC = mc ; /* Присвоение */
}
_________________
272 стр. Часть 5. Полезные особенности
Создание newMC следует стандартному шаблону создания нового объекта как зеркального отображения существующего с использованием копирующего конструктора MyClass( MyClass & ) . Несколько менее очевидно, что объект newerMC также создаётся при помощи конструктора копирования. Запись MyClass а = b — всего лишь другой способ записи MyClass a( b ) . То, что в первом варианте записи имеется символ " = ", не приводит к вызову оператора присвоения. Однако в случае с объектом newestMC всё не совсем так. Сначала этот объект создаётся с использованием конструктора по умолчанию, а затем перезаписывается объектом mc с помощью оператора присвоения.
Читать дальшеИнтервал:
Закладка: