- •1. Дополнения к с
- •1.1. Комментарии
- •1.2. Ключевые слова
- •1.3. Константы
- •1.4. Блочные объявления
- •1.5. Ссылки
- •1.6. Новая роль имён перечислений, структур и объединений
- •1.7. Распределение памяти
- •1.8. Встраиваемые функции
- •1.9. Перегрузка функций
- •1.10. Задание для параметров функции значений по умолчанию
- •1.11. Дополнительные операции для доступа к данным
- •1.12. Предопределённые потоки ввода-вывода
- •2.1. Инкапсуляция
- •2.2. Разграничение доступа (скрытие данных и методов)
- •2.3. Друзья классов
- •2.4. Конструкторы и деструкторы
- •2.5. Конструктор по умолчанию
- •2.6. Конструктор копирования
- •2.7. Несколько слов о деструкторах
- •2.8. Перегрузка операций
- •3.1. Наследование
- •3.2. Виртуальные функции –полиморфизм
- •3.3. Шаблоны
Язык программирования С++ и его «подводные камни» (по кн. Ю. Тихомирова «Visual C++ 6». – СПб., 1998. – 496 с.»
Некоторые вещи нам непонятны не потому, что наши понятия слабы, а потому, что вещи сии не входят в круг наших понятий.
Козьма Прутков
Знакомство с языком программирования С++ хотелось бы начать с небольшой цитаты из книги разработчика языка Бьярна Страуструпа:
«Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать…»
Язык поддерживает стиль программирования, если он предоставляет средства и делает удобным (т. е. легким, безопасным и эффективным) использование этого стиля... Например, можно писать структурированные программы на языке Fortran и объектно-ориентированные программы на С, но это неизменно будет трудно (во втором случае – особенно), поскольку они не поддерживают эти парадигмы.
Язык программирования С++ был разработан таким, чтобы в дополнение к традиционной технологии программирования на С поддерживать абстракцию данных и объектно-ориентированное программирование при определяющей роли следующих пяти ограничений, первое из которых выражает чисто эстетический и логический идеалы, следующие два – идеал минимальности и, наконец, два последних могут быть охарактеризованы как «то, что вам не нужно, но, скорее всего, не причинит ущерба»:
Все средства должны быть искусно и элегантно встроены в язык.
Должна присутствовать возможность использования этих средств в комбинации друг с другом.
Число паразитных и специальных средств должно быть минимальным.
Реализация каждого средства не должна приводить к существенным накладным расходам в программах, если этого можно избежать.
Программисту необходимо знать только ту часть языка, которая непосредственно применяется для данного класса программ.
Однако сказанное не означает, что программистам навязывается определённый стиль программирования.
После знакомства с общими положениями, которые хотел вложить в C++ его создатель, перейдем к изучению собственно языка.
1. Дополнения к с
Обсудим отличия, которые появились в С++ по отношению к языку C.
1.1. Комментарии
Символ комментария //, действующий до конца строки, является теперь составной частью языка, а не только расширением Microsoft., как это было для языка С.
1.2. Ключевые слова
Ключевые слова, характерные только для С++, приведены ниже.
bad_cast: explicit protected typeinfo
bad_typeid false public typeid
bool finally reinterpret_cast typename
catch friend signed using
class inline static_cast virtual
const mutable template volatile
const_cast namespace this xalloc
delete new throw
dynamic_cast: operator true
except private try
(Выделены ключевые слова, упоминающиеся в этом документе).
1.3. Константы
Как вы помните, для определения константы в С использовалась директива препроцессора #define, что было достаточно удобно. Отрицательной стороной такого определения является то, что при этом нельзя указать тип, которому принадлежит константа. В С++ введено новое ключевое слово const, позволяющее создавать константы. При этом явным образом указывается тип, который компилятор в дальнейшем может проверить.
const float PI = 3.1415926;
Константную переменную нельзя модифицировать и поэтому попытка изменить её вызывает ошибку во время компиляции. Константой можно объявить и указатель. При этом изменять нельзя только значение самого указателя, а объект (переменную), на который он указывает, менять можно:
int nValue;
const int *ptrVar = &nValue;
*ptrVar +=7; // Такое действие допустимо
ptrVar++; // А вот так нельзя изменять значение самого указателя
Ключевое слово const можно применить и к функции:
int AnyFunc(…) const;
. . .
int AnyFunc (…) const
{
. . .
}
В этом случае функция считается «только для чтения» и нельзя модифицировать объект, для которого она вызывается.
Примечание
1. Ключевое слово const необходимо указывать и при объявлении, и при определении функции.
2. Как правило, функции, возвращающие значения, с аргументами, тоже переданными значениями, не меняют своих аргументов. Речь идёт здесь в первую очередь о функциях – методах, которые не должны менять объект, для которого они вызываются, и требуется, чтобы компилятор проследил за этим.
1.4. Блочные объявления
В С++ допускаются объявления внутри блоков и после программных операторов, что позволяет определять (объявлять) объект в том месте программы, где он используется первый раз. Во многих случаях это улучшает читаемость программы.
void MyFunc()
{
int nFirstVar;
. . .
nFirstVar++;
// Другие операторы функции
float SecondVar = 7.0;
. . .
// Остальные операторы функции
}
Кроме того, можно определить и инициализировать переменную непосредственно внутри формального описания управляющей структуры:
for (int iCount = 0; iCount < MAX_COUNT; iCount++) {…} .
Примечание
Определённая таким образом переменная не входит в блок управляющей структуры и поэтому действует до конца всего блока, в котором используется эта структура. Поэтому следующая конструкция недопустима:
for (int iCount = 0; iCount < MAX_COUNT1; iCount++)
{
. . .
for (int iCount = 0; iCount < MAX_COUNT2; iCount++)
{
. . .
}