C++

На нашем литературном портале можно бесплатно читать книгу C++, Страустрап Бьярн-- . Жанр: Программирование. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
C++
Название: C++
Дата добавления: 15 январь 2020
Количество просмотров: 340
Читать онлайн

C++ читать книгу онлайн

C++ - читать бесплатно онлайн , автор Страустрап Бьярн

С++ – это универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. За исключением второстепенных деталей С++ является надмножеством языка программирования C. Помимо возможностей, которые дает C, С++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на легко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. Такие объекты просты и надежны в использовании в тех ситуациях, когда их тип нельзя установить на стадии компиляции. Программирование с применением таких объектов часто называют объектно-ориентированным. При правильном использовании этот метод дает более короткие, проще понимаемые и легче контролируемые программы.

Ключевым понятием С++ является класс. Класс – это тип, определяемый пользователем. Классы обеспечивают сокрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций. С++ предоставляет гораздо лучшие, чем в C, средства выражения модульности программы и проверки типов. В языке есть также усовершенствования, не связанные непосредственно с классами, включающие в себя символические константы, inline-подстановку функций, параметры функции по умолчанию, перегруженные имена функций, операции управления свободной памятью и ссылочный тип. В С++ сохранены возможности языка C по работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем.

С++ и его стандартные библиотеки спроектированы так, чтобы обеспечивать переносимость. Имеющаяся на текущий момент реализация языка будет идти в большинстве систем, поддерживающих C. Из С++ программ можно использовать C библиотеки, и с С++ можно использовать большую часть инструментальных средств, поддерживающих программирование на C.

Эта книга предназначена главным образом для того, чтобы помочь серьезным программистам изучить язык и применять его в нетривиальных проектах. В ней дано полное описание С++, много примеров и еще больше фрагментов программ.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 47 48 49 50 51 52 53 54 55 ... 70 ВПЕРЕД
Перейти на страницу:

Средства ввода/вывода «stream.h» связаны исключительно с обработкой преобразования типизированных объектов в последвательности символов и обратно. Есть и другие схемы ввода/ввода, но эта является основополагающей в системе UNIX, и большая часть видов двоичного ввода/вывода обрабатывается чрез рассмотрение символа просто как набора бит, при этом его общепринятая связь с алфавитом игнорируется. Тогда для прораммиста ключевая проблема заключается в задании соответствия между типизированным объектом и принципиально нетипизированой строкой.

Обработка и встроенных и определяемых пользователем тпов однородным образом и с гарантией типа достигается с пмощью одного перегруженного имени функции для набора функций вывода. Например:

put(cerr,"x = «); // cerr – поток вывода ошибок put(cerr,x); put(cerr,»n");

Тип параметра определяет то, какая из функций put будет вызываться для каждого параметра. Это решение применялось в нескольких языках. Однако ему недостает лаконичности. Перерузка операции «„ значением «поместить в“ дает более хорошую

запись и позволяет программисту выводить ряд объектов одним оператором. Например:

cerr «„ "x = " «« x «« «n“;

где cerr – стандартный поток вывода ошибок. Поэтому, ели x является int со значением 123, то этот оператор напечтает в стандартный поток вывода ошибок

x = 123

и символ новой строки. Аналогично, если X принадлежит определенному пользователем типу complex и имеет значение (1, 2.4), то приведенный выше оператор напечатает в cerr

x = (1,2.4)

Этот метод можно применять всегда, когда для x определна операция ««, и пользователь может определять операцию «« для нового типа.

8.2 Вывод

В этом разделе сначала обсуждаются средства форматного и бесформатного вывода встроенных типов, потом приводится стадартный способ спецификации действий вывода для определяемых пользователем типов.

8.2.1 Вывод встроенных типов

Класс ostream определяется вместе с операцией «„ («пместить в“) для обработки вывода встроенных типов:

class ostream (* // ... public: ostream amp; operator««(char*); ostream amp; operator««(int i) (* return *this««long(i); *) ostream amp; operator««(long); ostream amp; operator««(double);

ostream amp; put(char); *);

Функция operator«« возвращает ссылку на ostream, для кторого она была вызвана, чтобы к ней можно было применять другой ostream. Например:

cerr «« "x = " «« x;

где x является int, будет интерпретироваться как:

(cerr.operator««("x = ")).operator««(x);

В частности, отсюда следует, что когда один оператор ввода печатает несколько элементов, они будут печататься в ожидаемом порядке: слева направо. Наличие operator««, которая получает int, является избыточным, поскольку int может неявно преобразовываться в long. С другой стороны, int может преоразовываться также и в double. Наличие ostream::operator««(int) позволяет избежать этой неоднознаности. Для печати символов в виде символов предоставляется функция ostream::put(char), а ostream::operator««(int) печтает их целые значения.

8.2.2 Вывод определяемых пользователем типов

Рассмотрим определяемый пользователем тип:

class complex (* double re, im; public: complex(double r = 0, double i = 0) (* re=r; im=i; *)

friend double real(complex amp; a) (* returna.re; *) friend double real(complex amp; a) (* returna.re; *)

friend complex operator+(complex, complex); friend complex operator-(complex, complex); friend complex operator*(complex, complex); friend complex operator/(complex, complex); // ... *);

Операцию «« для нового типа complex можно определить так:

ostream amp; operator««(ostream amp;s, complex z) (* return s «« "(" «« real(z) «« "," «« imag(z) «« ")"; *)

и использовать точно так же, как для встроенного типа:

complex x(1,2); // ... cout «„ "x = " «« x «« «n“;

получая при этом

x = (1,2)

Определение действия вывода для определяемого пользовтелем типа не требует ни модификации описания класса ostream, ни доступа к структуре данных (скрытой), которую этот класс поддерживает. Очень удачно, что имеет место первое, потому что описание класса ostream находится в стандартных заголвочных файлах, к которым у обычного пользователя нет доступа на запись. Последнее также важно, потому что обеспечивает зщиту от случайной порчи структуры данных. Это также позволяет менять реализацию ostream не влияя на пользовательские прораммы.

8.2.3 Некоторые подробности разработки

Операция вывода используется, чтобы избежать той многоловности, которую дало бы использование функции вывода. Но почему ««?

Возможности изобрести новый лексический символ нет (#6.2). Операция присваивания была кандидатом одновременно и на ввод, и на вывод, но оказывается, большинство людей препочитают, чтобы операция ввода отличалась от операции вывода. Кроме того, = не в ту сторону связывается (ассоциируется), то есть cout=a=b означает cout=(a=b).

Делались попытки использовать операции « и », но значния «меньше» и «больше» настолько прочно вросли в сознание людей, что новые операции ввода/вывода во всех реальных слчаях оказались нечитаемыми. Помимо этого, "«" находится на большинстве клавиатур как раз на ",", и у людей получаются операторы вроде такого:

cout « x , y , z;

Для таких операторов непросто выдавать хорошие сообщения об ошибках.

Операции «„ и “» к такого рода проблемам не приводят, они асимметричны в том смысле, что их можно проассоциировать с "в" и «из», а приоритет «« достаточно низок, чтобы можно было не использовать скобки для арифметических выражений в роли операндов. Например:

cout «„ „a*b+c=“ «« a*b+c «« «n“;

Естественно, при написании выражений, которые содержат операции с более низкими приоритетами, скобки использовать надо. Например:

cout «„ „a^b!c=“ «« (a^b!c) «« «n“;

Операцию левого сдвига тоже можно применять в операторе вывода:

cout «„ „a««b=“ «« (a««b) «« «n“;

В С++ нет выражений с символьными значениями, в частноти, 'n' является целым (со значением 10, если используется набор символов ASCII), поэтому

cout «« "x = " «« x «« 'n';

напечатает число 10, а не ожидаемый символ новой строки. Эту и аналогичные проблемы можно сгладить, определив несколко макросов (в которых используются стандартные имена симвлов ASСII):

#define sp «„ " " #define ht „« «t“ #define nl «« «n“

Теперь предыдущий пример запишется в виде:

cout «« "x = " «« x nl;

Для печати символов предоставляются функции ostream::put (char) и chr(int) (см. #8.2.4). Хотя в некоторых кругах нсинтаксические макросы считаются худшим видом макросов, мне они нравятся.

Рассмотрим примеры:

cout «„ x „« " " «« y «« " " «« z «« «n“; cout «« "x = " «« x «« ", y = " «« y «« «n“;

Люди находят их трудно читаемыми из-за большого числа кавычек и того, что операция вывода внешне выглядит слишком непривычно. Здесь могут помочь приведенные выше макросы и несколько отступов:

cout «« x sp «« y sp «« z nl; cout «« "x = " «« x «« ", y = " «« y nl;

8.2.4 Форматированный вывод

Пока «« применялась только для неформатированного вывда, и на самом деле в реальных программах она именно для этго главным образом и применяется. Помимо этого существует также несколько форматирующих функций, создающих представление своего параметра в виде строки, которая используется для вывода. Их второй (необязательный) параметр указывает, сколко символьных позиций должно использоваться.

char* oct(long, int=0); // восьмеричное представление char* dec(long, int=0); // десятичное представление char* hex(long, int=0); // шестнадцатиричное представление char* chr(int, int=0); // символ char* str(char*, int=0); // строка

1 ... 47 48 49 50 51 52 53 54 55 ... 70 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название