Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования С++ и его «подводные камни».DOC
Скачиваний:
39
Добавлен:
01.05.2014
Размер:
1.02 Mб
Скачать

Язык программирования С++ и его «подводные камни» (по кн. Ю. Тихомирова «Visual C++ 6». – СПб., 1998. – 496 с.»

Некоторые вещи нам непонятны не потому, что наши понятия слабы, а потому, что вещи сии не входят в круг наших понятий.

Козьма Прутков

Знакомство с языком программирования С++ хотелось бы начать с неболь­шой цитаты из книги разработчика языка Бьярна Страуструпа:

«Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется про­грам­­мист, размышляя о том, что делать…»

Язык поддерживает стиль программирования, если он предоставляет средст­ва и делает удобным (т. е. легким, безопасным и эффективным) использова­ние этого стиля... Например, можно писать струк­ту­ри­ро­ван­ные программы на языке Fortran и объектно-ориентированные про­грам­мы на С, но это не­изменно будет трудно (во втором случае – особенно), поскольку они не поддерживают эти парадигмы.

Язык программирования С++ был разработан таким, чтобы в дополнение к традиционной технологии программирования на С поддерживать абстрак­цию данных и объектно-ориентированное программирование при опреде­ляющей роли следующих пяти ограничений, первое из которых выражает чисто эстетический и логический идеалы, следующие два – идеал мини­мальности и, наконец, два последних могут быть оха­ра­к­те­ри­зо­ваны как «то, что вам не нужно, но, скорее всего, не причинит ущерба»:

Все средства должны быть искусно и элегантно встроены в язык.

Должна присутствовать возможность использования этих средств в ком­бинации друг с другом.

Число паразитных и специальных средств должно быть минимальным.

  1. Реализация каждого средства не должна приводить к существенным на­клад­ным расходам в программах, если этого можно избежать.

  2. Программисту необходимо знать только ту часть языка, которая непосредственно применяется для данного класса программ.

Однако сказанное не означает, что программистам навязывается определённый стиль про­грам­ми­ро­ва­ния.

После знакомства с общими положениями, которые хотел вложить в 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++)

{

. . .

}