Мюррей Хилл - C++ Страница 13
- Категория: Компьютеры и Интернет / Программирование
- Автор: Мюррей Хилл
- Год выпуска: неизвестен
- ISBN: нет данных
- Издательство: неизвестно
- Страниц: 60
- Добавлено: 2019-05-29 11:11:09
Мюррей Хилл - C++ краткое содержание
Прочтите описание перед тем, как прочитать онлайн книгу «Мюррей Хилл - C++» бесплатно полную версию:С++ – это универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. За исключением второстепенных деталей С++ является надмножеством языка программирования C. Помимо возможностей, которые дает C, С++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на легко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. Такие объекты просты и надежны в использовании в тех ситуациях, когда их тип нельзя установить на стадии компиляции. Программирование с применением таких объектов часто называют объектно-ориентированным. При правильном использовании этот метод дает более короткие, проще понимаемые и легче контролируемые программы. Ключевым понятием С++ является класс. Класс – это тип, определяемый пользователем. Классы обеспечивают сокрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций. С++ предоставляет гораздо лучшие, чем в C, средства выражения модульности программы и проверки типов. В языке есть также усовершенствования, не связанные непосредственно с классами, включающие в себя символические константы, inline-подстановку функций, параметры функции по умолчанию, перегруженные имена функций, операции управления свободной памятью и ссылочный тип. В С++ сохранены возможности языка C по работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем. С++ и его стандартные библиотеки спроектированы так, чтобы обеспечивать переносимость. Имеющаяся на текущий момент реализация языка будет идти в большинстве систем, поддерживающих C. Из С++ программ можно использовать C библиотеки, и с С++ можно использовать большую часть инструментальных средств, поддерживающих программирование на C. Эта книга предназначена главным образом для того, чтобы помочь серьезным программистам изучить язык и применять его в нетривиальных проектах. В ней дано полное описание С++, много примеров и еще больше фрагментов программ.
Мюррей Хилл - C++ читать онлайн бесплатно
Очевидным способом реализации ссылки является константный указатель, который разыменовывается при каждом использовании. Это делает инициализацию ссылки тривиальной, когда инициализатор является lvalue (объектом, адрес которого вы можете взять, см. #с.5). Однако инициализатор для amp;T не обязательно должен быть lvalue, и даже не должен быть типа T. В таких случаях:
1. Во-первых, если необходимо, применяется преобразование типа (#с.6.6-8, #с.8.5.6),
2. Затем полученное значение помещается во временную переменную и
3. Наконец, ее адрес используется в качестве значения инициализатора.
Рассмотрим описание
double amp; dr = 1;
Это интерпретируется так:
double* drp; // ссылка, представленная как указатель double temp; temp = double(1); drp = amp;temp;
int x = 1; void incr(int amp; aa) (* aa++; *) incr(x) // x = 2
По определению семантика передачи параметра та же, что семантика инициализации, поэтому параметр aa функции incr становится другим именем для x. Однако, чтобы сделать программу читаемой, в большинстве случаев лучше всего избегать функций, которые изменяют значение своих параметров. Часто
предпочтительно явно возвращать значение из функции или требовать в качестве параметра указатель:
int x = 1; int next(int p) (* return p+1; *) x = next(x); // x = 2
void inc(int* p) (* (*p)++; *) inc( amp;x); // x = 3
Ссылки также можно применять для определения функций, которые могут использоваться и в левой, и в правой части присваивания. Опять, большая часть наиболее интересных случаев этого встречается при разработке нетривиальных типов, определяемых пользователем. Для примера давайте определим простой ассоциативный массив. Вначале мы определим структуру пары следующим образом:
struct pair (* char* name; int val; *);
Основная идея состоит в том, что строка имеет ассоциированное с ней целое значение. Легко определить функцию поиска find(), которая поддерживает структуру данных, состоящую из одного pair для каждой отличной от других строки, которая была ей представлена. Для краткости представления используется очень простая (и неэффективная) реализация:
const large = 1024; static pair vec[large+1*);
pair* find(char* p) /* поддерживает множество пар «pair»: ищет p, если находит, возвращает его «pair», иначе возвращает неиспользованную «pair» */ (* for (int i=0; vec[i].name; i++) if (strcmp(p,vec[i].name)==0) return amp;vec[i];
if (i == large) return amp;vec[large-1];
return amp;vec[i]; *)
Эту функцию может использовать функция value(), реализующая массив целых, индексированный символьными строками (вместо обычного способа):
int amp; value(char* p) (* pair* res = find(p); if (res-»name == 0) (* // до сих пор не встречалось: res-»name = new char[strlen(p)+1]; // инициализировать strcpy(res-»name,p); res-»val = 0; // начальное значение 0 *) return res-»val; *)
Для данной в качестве параметра строки value() находит целый объект (а не значение соответствующего целого); после чего она возвращает ссылку на него. Ее можно использовать,
например, так:
const MAX = 256; // больше самого большого слова
main() // подсчитывает число вхождений каждого слова во вводе (* char buf[MAX];
while (cin»»buf) value(buf)++;
for (int i=0; vec[i].name; i++) cout «„ vec[i].name «« ": " «« vec [i].val «« «\n“; *)
На каждом проходе цикл считывает одно слово из стандартной строки ввода cin в buf (см. Главу 8), а затем обновляет связанный с ней счетчик с помощью find(). И, наконец, печатается полученная таблица различных слов во введенном тексте, каждое с числом его встречаемости. Например, если вводится
aa bb bb aa aa bb aa aa
то программа выдаст:
aa: 5 bb: 3
Легко усовершенствовать это в плане собственного типа ассоциированного массива с помощью класса с перегруженной операцией (#6.7) выбора [].
2.3.11 Регистры
Во многих машинных архитектурах можно обращаться к (небольшим) объектам заметно быстрее, когда они помещены в регистр. В идеальном случае компилятор будет сам определять оптимальную стратегию использования всех регистров, доступных на машине, для которой компилируется программа. Однако это нетривиальная задача, поэтому иногда программисту стоит дать подсказку компилятору. Это делается с помощью описания объекта как register. Например:
register int i; register point cursor; register char* p;
Описание register следует использовать только в тех случаях, когда эффективность действительно важна. Описание каждой переменной как register засорит текст программы и может даже увеличить время выполнения (обычно воспринимаются все инструкции по помещению объекта в регистр или удалению его оттуда).
Невозможно получить адрес имени, описанного как register, регистр не может также быть глобальным.
2.4 Константы
С++ дает возможность записи значений основных типов: символьных констант, целых констант и констант с плавающей точкой. Кроме того, ноль (0) может использоваться как константа любого указательного типа, и символьные строки являются константами типа char[]. Можно также задавать символические константы. Символическая константа – это имя, значение которого не может быть изменено в его области видимости. В С++ имеется три вида символических констант: (1) любому значению
любого типа можно дать имя и использовать его как константу, добавив к его описанию ключевое слово const; (2) множество целых констант может быть определено как перечисление; и (3) любое имя вектора или функции является константой.
2.4.1 Целые Константы
Целые константы предстают в четырех обличьях: десятичные, восьмеричные, шестнадцатеричные константа и символьные константы. Десятичные используются чаще всего и выглядят так, как можно было бы ожидать:
0 1234 976 12345678901234567890
Десятичная константа имеет тип int, при условии, что она влезает в int, в противном случае ее тип long. Компилятор должен предупреждать о константах, которые слишком длинны для представления в машине.
Константа, которая начинается нулем за которым идет x (0 x), является шестнадцатеричным числом (с основанием 16), а константа, которая начинается нулем за которым идет цифра, является восьмеричным числом (с основанием 8). Вот примеры восьмеричных констант:
0 02 077 0123
их десятичные эквиваленты – это 0, 2, 63, 83. В шестнадцатиричной записи эти константы выглядят так:
0x0 0x2 0x3f 0x53
Буквы a, b, c, d, e и f, или их эквиваленты в верхнем регистре, используются для представления чисел 10, 11, 12, 13, 14 и 15, соответственно. Восьмеричная и шестнадцатеричная записи наиболее полезны для записи набора битов применение этих записей для выражения обычных чисел может привести к неожиданностям. Например, на машине, где int представляется как двоичное дополнительное шестнадцатеричное целое, 0xffff является отрицательным десятичным числом -1; если бы для представления целого использовалось большее число битов, то оно было бы числом 65535.
2.4.2 Константы с Плавающей Точкой
Константы с плавающей точкой имеют тип double. Как и в предыдущем случае, компилятор должен предупреждать о константах с плавающей точкой, которые слишком велики, чтобы их моно было представить. Вот некоторые константы с плавающей точкой:
1.23 .23 0.23 1. 1.0 1.2e10 1.23e-15
Заметьте, что в середине константы с плавающей точкой не может встречаться пробел. Например, 65.43 e-21 является не константой с плавающей точкой, а четырьмя отдельными лексическими символами (лексемами):
65.43 e – 21
и вызовет синтаксическую ошибку.
Если вы хотите иметь константу константа с плавающей точкой; типа float, вы можете определить ее так (#2.4.6):
const float pi = 3.14159265;
2.4.3 Символьные Константы
Хотя в С++ и нет отдельного символьного типа данных, точнее, символ может храниться в целом типе, в нем для символов имеется специальная и удобная запись. Символьная константа – это символ, заключенный в одинарные кавычки; например, 'a' или '0'. Такие символьные константы в действительности являются символическими константами для целого значения символов в наборе символов той машины, на которой будет выполняться программа (который не обязательно совпадает с набором символов, применяемом на том компьютере, где программа компилируется). Поэтому, если вы выполняетесь на машине, использующей набор символов ASCII, то значением '0' будет 48, но если ваша машина использует EBCDIC набор символов, то оно будет 240. Употребление символьных констант вместо десятичной записи делает программу более переносимой. Несколько символов также имеют стандартные имена, в которых обратная косая \ используется как escape-символ:
'\b', возврат назад '\f', перевод формата '\n', новая строка '\r', возврат каретки '\t', горизонтальная табуляция '\v', вертикальная табуляция '\\', \ обратная косая (обратный слеш) '\'', одинарная кавычка ' '\"', двойная кавычка " '\0', null, пустой символ, целое значение 0
Вопреки их внешнему виду каждое является одним символом. Можно также представлять символ одно-, два или трехзначным восьмеричным числом (символ \, за которым идут восьмеричные цифры), или одно-, два или трехзначным шестнадцатеричным числом (\x, за которым идут шестнадцатеричные цифры). Например:
'\6' '\x6' 6 ASCII ack '\60' '\x30' 48 ASCII '0' '\137' '\x05f' 95 ASCII '_'
Это позволяет представлять каждый символ из машинного набора символов, и в частности вставлять такие символы в символьные строки (см. следующий раздел). Применение числовой записи для символов делает программу непереносимой между машинами с различными наборами символов.
Жалоба
Напишите нам, и мы в срочном порядке примем меры.