-->

C++

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

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

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

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

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

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

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

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

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

void myshape::move() (* rectangle::move(); l_eye-»move(a,b);

r_eye-»move(a,b); mouth-»move(a,b); *)

Мы можем, наконец, построить несколько фигур и немного их подвигать:

main() (* shape* p1 = new rectangle(point(0,0),point(10,10)); shape* p2 = new line(point(0,15),17); shape* p3 = new myshape(point(15,10),point(27,18)); shape_refresh(); p3-»move(-10,-10); stack(p2,p3); stack(p1,p2); shape_refresh(); return 0; *)

Еще раз обратите внимание, как функции вроде shape_refresh() и stack() манипулируют объектами типов, опрделяемых гораздо позже, чем были написаны (и, может быть, окомпилированы) сами эти функции.

7.7 Свободная память

Если вы пользовались классом slist, вы могли обнаружить, что ваша программа тратит на заметное время на размещение и освобождение объектов класса slink. Класс slink – это превоходный пример класса, который может значительно выиграть от того, что программист возьмет под контроль управление свобоной памятью. Для этого вида объектов идеально подходит оптмизирующий метод, который описан в #5.5.6. Поскольку каждый slink создается с помощью new и уничтожается с помощью delete членами класса slist, другой способ выделения памяти не представляет никаких проблем.

Если производный класс осуществляет присваивание указтелю this, то конструктор его базового класса будет вызыватся только после этого присваивания, и значение указателя this в конструкторе базового класса будет тем, которое присвоено конструктором производного класса. Если базовый класс присвивает указателю this, то будет присвоено то значение, которое использует конструктор производного класса. Например:

#include «stream.h»

struct base (* base(); *);

struct derived : base (* derived(); *)

base::base() (* cout «„ „tbase 1: this=“ „„ int(this) «« «n“; if (this == 0) this = (base*)27; cout «« «tbase 2: this=“ «« int(this) «« «n“; *)

derived::derived() (* cout «„ „tderived 1: this=“ „„ int(this) «« «n“; this = (this == 0) ? (derived*)43 : this; cout «« «tderived 2: this=“ «« int(this) «« «n“; *)

main() (* cout «„ „base b;n“; base b; cout „„ „new base b;n“; new base; cout «« «derived d;n“; derived d; cout «« «new derived d;n“; new derived; cout «« «at the endn“;

*)

порождает вывод

base b; base 1: this=2147478307 base 2: this=2147478307 new base; base 1: this=0 base 2: this=27 derived d; derived 1: this=2147478306 base 1: this=2147478306 base 2: this=2147478306 derived 1: this=2147478306 new derived; derived 1: this=0 base 1: this=43 base 2: this=43 derived 1: this=43 at the end

Если деструктор производного класса осуществляет присвивание указателю this, то будет присвоено то значение, котрое встретил деструктор его базового класса. Когда кто-либо делает в конструкторе присваивание указателю this, важно, чтобы присваивание указателю this встречалось на всех путях в конструкторе*.

– * К сожалению, об этом присваивании легко забыть. Напрмер, в первом издании этой книги (английском – перев.) вторая строка конструктор derived::derived() читалась так:

if (this == 0) this = (derived*)43;

И следовательно, для d конструктор базового класса base::base() не вызывался. Программа была допустимой и коректно выполнялась, но, очевидно, делала не то, что подразмевал автор. (прим. автора)

7.8 Упражнения

1. (*1) Определите

class base (* public: virtual void iam() (* cout «„ «basen“; *) *);

Выведите из base два класса и для каждого определите iam () («я есть»), которая выводит имя класса на печать. Создайте объекты этих классов и вызовите для них iam(). Присвойте адреса объектов производных классов указателям base* и вызовите iam() через эти указатели.

2. (*2) Реализуйте примитивы экрана (#7.6.1) подходящим для вашей системы образом.

3. (*2) Определите класс triangle (треугольник) и класс circle (круг).

4. (*2) Определите функцию, которая рисует линию, соединящую две фигуры, отыскивая две ближайшие «точки соприконовения» и соединяя их.

5. (*2) Модифицируйте пример с фигурами так, чтобы line бла rectangle и наоборот.

6. (*2) Придумайте и реализуйте дважды связанный список, который можно использовать без итератора.

7. (*2) Придумайте и реализуйте дважды связанный список, которым можно пользоваться только посредством итератора. Итератор должен иметь действия для движения вперед и нзад, действия для вставления и удаления элементов спика, и способ доступа к текущему элементу.

8. (*2) Постройте обобщенный вариант дважды связанного списка.

9. (*4) Сделайте список, в котором вставляются и удаляются сами объекты (а не просто указатели на объекты). Продлайте это для класса X, для которого определены X::X(X amp;), X::~X() X::operator=(X amp;).

10. (*5) Придумайте и реализуйте библиотеку для написания моделей, управляемых прерываниями. Подсказка: «task.h». Только это – старая программа, а вы могли бы написать лучше. Должен быть класс task – задача. Объект класса task должен мочь сохранять свое состояние и восстанавлваться в это состояние (вы можете определить task::save() и task::restore()), чтобы он мог действвать как сопрограмма. Отдельные задачи можно определять как объекты классов, производных от класса task. Прорамма, которую должна исполнять задача, может задаваться как виртуальная функция. Должна быть возможность передвать новой задаче ее параметры как параметры ее контруктора(ов). Там должен быть планировщик, реализующий концепцию виртуального времени. Обеспечьте функцию здержки task::delay(), которая «тратит» виртуальное время. Будет ли планировщик отдельным или частью класса task – это один из основных вопросов, которые надо ршить при проектировании. Задача должна передавать даные. Для этого разработайте класс queue (очередь). Прдумайте способ, чтобы задача ожидала ввода из нескольких очередей. Ошибки в ходе выполнения обрабатывайте однродным образом. Как бы вы отлаживали программы, написаные с помощью такой библиотеки?

Глава 8

Потоки

``bad input char: .Ppm(*=P!..*@Z9A*)5!!!!!"syui!!!"!Mp#V6P?p8`;!4lf amp;

сообщение об ошибке (сокращенное)

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

8.1 Введение

Разработка и реализация стандартных средств ввода/вывода для языка программирования зарекомендовала себя как заведомо трудная работа. Традиционно средства ввода/вывода разрабатвались исключительно для небольшого числа встроенных типов данных. Однако в С++ программах обычно используется много тпов, определяемых пользователем, и нужно обрабатывать ввод и вывод также и значений этих типов. Очевидно, средство ввда/вывода должно быть простым, удобным, надежным в употреблнии, эффективным и гибким, и ко всему прочему полным. Ничье решение еще не смогло угодить всем, поэтому у пользователя должна быть возможность задавать альтернативные средства ввда/вывода и расширять стандартные средства ввода/вывода прменительно к требованиям приложения.

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

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