Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

 
				
			Программирование. Принципы и практика использования C++ Исправленное издание читать книгу онлайн
Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка.
    Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие.
    Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток.
    Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».
Двоичная система основана на базе счисления, равной двум. В этой системе есть только две цифры: 0 и 1. В языке С++ невозможно непосредственно представить двоичные числа как литералы. В качестве литералов и формата ввода-вывода в языке С++ непосредственно поддерживаются только восьмеричные, десятичные и шестнадцатеричные числа. Однако двоичные числа полезно знать, даже если мы не можем явно представить их в тексте программы. Например, десятичное число 123 равно 1*2^6+1*2^5+1*2^4+1*2^3+0*2^2+1*2+1, т.е. 1*64+1*32+1*16+1*8+0*4+1*2+1, т.е. (в двоичном виде) 1111011.
A.2.2. Литералы с плавающей точкой
Литералы с плавающей точкой (floating-point-literal) содержат десятичную точку (.), показатель степени (например, e3) или суффикс, обозначающий число с плавающей точкой (d или f). Рассмотрим примеры.
123 // int (нет десятичной точки, суффикса или показателя степени)
123. // double: 123.0
123.0 // double
.123 // double: 0.123
0.123 // double
1.23e3 // double: 1230.0
1.23e–3 // double: 0.00123
1.23e+3 // double: 1230.0
Литералы с плавающей точкой имеют тип double, если суффикс не означает иное. Рассмотрим примеры.
1.23 // double
1.23f // float
1.23L // long double
A.2.3. Булевы литералы
Литералами типа bool являются литералы true и false. Целочисленное значение литерала true равно 1, а литерала false — 0.
A.2.4. Символьные литералы
Символьный литерал (character literal) — это символ, заключенный в одинарные кавычки, например 'a' или '@'. Кроме того, существует несколько специальных символов.
Специальный символ представляется с помощью имени в языке C++, заключенного в одинарные кавычки, например 'n' (новая строка) и 't' (табуляция).
Набор символов содержит следующие видимые символы:
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
!@#$%^&*()_+|~`{}[]:";'<>?,./
В переносимом коде нельзя рассчитывать на дополнительные видимые символы. Значение символа, например 'a' для буквы a, зависит от реализации (но его легко выяснить, например, выполнив инструкцию, cout << int('a')).
A.2.5. Строковые литералы
Строковый литерал (string literal) — это последовательность символов, заключенных в двойные кавычки, например "Knuth" и "King Canute". Строковый литерал нельзя произвольно разбивать на несколько строк; для перехода на новую строку используется специальный символ n.
"King
Canute" // ошибка: переход на новую строку в строковом литерале
"KingnCanute" // OK: правильный переход на новую строку
Два строковых литерала, разделенных только одним пробелом, считаются одним строковым литералом. Рассмотрим пример.
"King" "Canute" // эквивалентно "KingCanute" (без пробела)
Обратите внимание на то, что специальные символы, такие как n, могут входить в строковые литералы.
A.2.6. Указательные литералы
Существует только один указательный литерал (pointer literal): нулевой указатель (0). В качестве нулевого указателя можно использовать любое константное выражение, равное 0.
t* p1 = 0; // OK: нулевой указатель
int* p2 = 2–2; // OK: нулевой указатель
int* p3 = 1; // ошибка: 1 — int, а не указатель
int z = 0;
int* p4 = z; // ошибка: z — не константа
В данном случае значение 0 неявно превращается в нулевой указатель. Как правило (но не всегда), нулевой указатель представляется в виде битовой маски, состоящей из одних нулей, как и число 0.
В языке C++ (но не в языке C, поэтому будьте осторожны с заголовками языка C) литерал NULL по определению равен 0, поэтому можно написать следующий код:
int* p4 = NULL; // ( при правильном определении литерала NULL)
// нулевой указатель
В языке C++0x нулевой указатель будет обозначаться ключевым словом nullptr. А пока рекомендуем использовать для этого число 0.
A.3. Идентификаторы
Идентификатор (identifier) — это последовательность символов, начинающаяся с буквы или знака подчеркивания, за которыми следуют (или не следуют) буквы, цифры или знаки подчеркивания (в верхнем или нижнем регистре).
int foo_bar; // OK
int FooBar; // OK
int foo bar; // ошибка: пробел не может использоваться
// в идентификаторе
int foo$bar; // ошибка: символ $ не может использоваться
// в идентификаторе
Идентификаторы, начинающиеся со знака подчеркивания или содержащие двойной символ подчеркивания, резервируются для использования компилятором; не используйте их. Рассмотрим пример.
int _foo; // не рекомендуем
int foo_bar; // OK
int foo__bar; // не рекомендуем
int foo_; // OK
A.3.1. Указательные литералы
Ключевые слова (keywords) — это идентификаторы, используемые самим языком для выражения языковых конструкций.
A.4. Область видимости, класс памяти и время жизни
Каждое имя в языке C++ (за исключением имен препроцессора; см. раздел A.17) имеет определенную область видимости (scope); иначе говоря, существует область текста, в которой его можно использовать. Данные (объекты) хранятся в памяти; вид памяти, используемой для хранения объекта, называется классом памяти (storage class). Время жизни (lifetime) объекта отсчитывается от момента его инициализации до момента окончательного уничтожения.
A.4.1. Область видимости
Существует пять видов областей видимости (см. раздел 8.4).
• Глобальная область видимости (global scope). Имя находится в глобальной области видимости, если оно объявлено вне языковой конструкции (например, вне класса или функции).
• Область видимости пространства имен (namespace scope). Имя находится в области видимости пространства имен, если оно определено в пространстве имен и вне какой-либо языковой конструкции (например, вне класса и функции). Формально говоря, глобальная область видимости — это область видимости пространства имен с “пустым именем”.
• Локальная область видимости (local scope). Имя находится в локальной области видимости, если она объявлена в функции (включая параметры функции).
• Область видимости класса (class scope). Имя находится в области
 
        
	 
        
	 
        
	 
        
	