Главная » Просмотр файлов » Б. Страуструп - Дизайн и Эволюция C++. 2006

Б. Страуструп - Дизайн и Эволюция C++. 2006 (1160775), страница 26

Файл №1160775 Б. Страуструп - Дизайн и Эволюция C++. 2006 (Б. Страуструп - Дизайн и Эволюция C++. 2006) 26 страницаБ. Страуструп - Дизайн и Эволюция C++. 2006 (1160775) страница 262019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 26)

Статические и автоматические (с выделением памяти из стека) объекты всегда было возможно создать, и именно для них управление памятью реализуется максимально эффективно. Типичный пример — класс Ясгхпд. Его объекты обычно создаются в стеке, следовательно, не требуют явного управления памятью, а необходимая для них свободная память распределяется невидимо для пользователя функциями-членами класса. Примененная выше нотация для записи конструкторов обсуждается в разделах 3.11.2 и 3.11.3. 3.10. Контроль типов Правила контроля типов в языке С++ появились как результат опыта работы с С ьу(гп С1аззез.

Все вызовы функций проверяются во время компиляции. Проверку последних аргументов можно отменить, дав явное указание в объявлении функции. Это необходимо для функции рг1псй () из библиотеки С: гпс рггпсГ(сопвс спал* ...); // принимаются любые аргументы после // начальной символьной строки // рг1пСГ("с)апе: вв Ьс) 19$Фп*, юопСЬ,с)ау,уеаг); // может, и правильно Было предложено несколько механизмов контроля типов. Полный обход системы контроля типов с помощью многоточия являлся самым радикальным и наименее рекомендуемым. Перегрузка имен функций (см.

раздел 3.6.1) и аргументы по умолчанию 181гонзггпр,198б~ (см, раздел 2.12.2) дали возможность сделать вид, что имеется одна функция, принимающая разные множества аргументов„при этом не приходилось жертвовать безопасностью типов. Кроме того, я спроектировал систему потокового ввода/вывода, дабы продемонстрироватгь что ослабление контроля типов необязательно даже в этом случае (см. раздел 8.3.1). Так, запись сопс « "дата: "«юопСЬ«' '«с)ау«" 19 "«уеаг«'1п'; является безопасной версией примера, приведенного выше.

Я считал и считаю до сих пор, что контроль типов — это, скорее, практический инструмент, а не самоцель. Важно понимать: устранение из программы всех до единого нарушений согласованности типов не гарантирует ни правильности программы, ни даже того, что она не перестанет работать (причина — использование объекта противоречит его определению). Например, случайный электрический импульс может кардинально изменить значение бита памяти. Считать небезопасное использование типов и крах программы эквивалентными явлениями — безответственно и неправильно.

Это то же самое, как не видеть разницы между зависанием Рождение С++ ПИИИИИИВй компьютера и такими катастрофами, как крушение самолета, обрыв телефонного кабеля или авария на АЭС. Надежность системы зависит от всех ее элементов, и нельзя возлагать ответственность за ошибку только на какой-то один. Мы пытаемся проектировать важные системы так, чтобы ни отдельная ошибка, ни даже множество ошибок не приводили к полному краху. Ответственность за целостность системы лежит на людях, которые ее создавали.

В частности, безопасное использование типов — не замена тестированию, хотя оно может оказать существенную помощь при подготовке системы к тестированию. Ругать язык программирования за тот или иной сбой в системе, даже чисто программной, — значит не понимать сути предмета (см. также раздел 16.2). 3.11. Второстепенные возможности При переходе от С зу(11( С!аваев к С++ было добавлено несколько второстепенных возможностей 3.11.1. Комментарии Из второстепенных возможностей самой заметной было введение комментариев в стиле ВСР1л глг а; /* явно завершающийся комментарий в стиле С */ 1лг Ь; // комментарий в стиле всэь, действующий до конца строки Допустимы оба вида комментариев, поэтому программист может выбирать тот, что ему больше по душе.

Я предпочитаю однострочные комментарии а-ля ВСР(-. Поводом для введения комментариев, начинающихся с //, было то, что изредка я делал глупые ошибки, забывая закончить С-комментарий, а иногда добавление трех лишних символов делало этот комментарий слишком длинным, не помещавшимся на одной строке экрана. Еще я заметил, что // удобнее, чем /* для комментирования коротких участков кода. Скоро обнаружилось, что добавление // не вполне совместимо с С. Так, выражение х = а//* разделить на */Ь в С++ означает к=а, а в С вЂ” х=а/Ь. Но и тогда, и сейчас большинство программистов на С не считают, что на практике такое расхождение может составлять проблему. 3.11.2.

Нотация для конструкторов Название «функция пемз для конструктора всегда было источником путаницы, поэтому были введены именованные конструкторы. Одновременно появилось разрешение явно использовать конструкторы в выражениях: сошр1ех 1 = сошр1ех(0,1); сошр1ех орегасог«(сощр1ех а, соп1р1ех Ь( Второстепенные возможности й6ИИИИИКИ ( лесото сошр1ек(а.гезЬ.ге, а.1ш+Ь.ьш); ) Выражение вида сотр1ех (х, у ) — это явный вызов конструктора класса союр1ех. Чтобы уменьшить число ключевых слов, я решил не пользоваться явным синтаксисом вроде с1авв Х соле"госсот(); бевсгоссог(); // ): Вместо этого был выбран декларативный синтаксис, лучше отражающий характер использования конструкторов: Явный вызов конструкторов в выражениях оказался очень полезным, но явился причиной многих проблем при синтаксическом анализе С++-программ. В С зу(тЬ С(аваев функции пеы() и с)е1еее () по умолчанию считались риЬ11с.

Эта аномалия была устранена таким образом, чтобы конструкторы и деструкторы подчинялись тем же правилам контроля доступа, что и обычные функции. Например: с1авв У ( у(); // закрытый конструктор // ); у а; // ошибка: нет доступа к закрытому члену у:."у() В результате появились многие полезные приемы, основанные на идее контроля над операциями путем сокрытия функций, которые их выполняют (см. раздел 11А).

3.11.3. Квалификация В С зу(1Ь С!аваев точка использовалась для обозначения принадлежности к классу, а также для выбора члена конкретного объекта. Подчас из-за этого возникали неоднозначные конструкции. Вот пример: с1авв Х 1пс а; рнЬ11с: чоьб вес(х); ): чо1Й Х.вев(х агу) ( а = агп,а; ); // пока все корректно с1авв Х ( х(); -Х (); // // конструктор // деструктор (в С оператор — означает дополнение) Рождение С++ ПИИИИИИ!1 с1авв Х Х; // обычный прием в С: // у класса и обьекта одно и то ве имл чогс) Г() ( // Х.а; // ) // что означает х: класс или обьектз чогб Х::вег(Х агп) ( а = ага.а; с1авв Х Х; чоьа д() // Х.а; // объект.член Х:;а; // класс::член // ) Э.ПА.

Инициализация глобальных объектов Я поставил целью разрешить использование определенных пользователем типов всюду, где допустимы встроенные типы. По опыту работы с В1шц)а было известно, что отсутствие глобальных переменных типа класса — одна из причин снижения производительности. В С++ они были разрешены. Это имело важные и в чем-то неожиданные последствия. Рассмотрим пример: с1авв ПонЫе ( // ПонЫе (с)оиЫе); ОонЫе в1 = 2; ОонЫе в2 = вцгг(2); О конструирование в1 из 2 // конструирование в2 из вцгс(2) В общем случае такую инициализацию нельзя выполнить ни во время компиляции, ни во время связывания. Необходима динамическая инициализация (во время исполнения). Она выполняется в том порядке, в котором объявления встречаются в единице трансляции.

Порядок инициализации объектов из разных единиц трансляции не определен. Гарантируется лишь, что статическая инициализация будет выполнена раньше динамической. Чтобы справиться с данной проблемой, для обозначения членства в классе была введена нотация::, а . (точка) оставлена только для обозначения членов объекта. Тогда приведенный выше пример записывается так: Второстепенные возможности 3. 11 4.1. Проблемы динамической инициализации Предполагалось, что глобальиые объекты будут доволыю простыми, и сложная инициализация для иих ие понадобится.

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

В библиотеке часто бывает необходимо выполнить какие-то действия до того, как будут использоваться отдельные функции из иее. С другой стороны, в библиотеке могут быть объекты, которые следовало бы инициализировать предварительно, чтобы пользователь мог сразу применять их, не задумываясь об ииициализации. Например, вы же ие инициализируете переменные эсг11п и эсс(оис из стандартной библиотеки С, за вас это делает стартовый модуль. А закрывает эти потоки библиотечная функция ех1с (). Это очень специфическая ситуация, ничего подобного в других библиотеках иет.

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

Другие разработчики оказались ие такими внимательными. В результате программы аварийно завершались, поскольку сопс использовался еще до того, как был сконструирован. С другой стороны, часть выходных данных терялась из-за того, что сопс уиичтожался (со сбросом буферов) слишком рано. Другими словами, мы попались патой самой зависимости от порядка вьшолиеиия, которую я считал «маловероятиой и признаком плохого дизайна». 3.11.4.2. Как обойти зависимость от порядка Есть два решения данной проблемы.

Очевидное — добавить к каждой функции-члеиу флажок, сигиализирующий, в первый ли раз выполняется фрагмент данного кода. Для этого необходима некая глобальная переменная, ииициализироваиная нулем. Например: с1азз 2 ( зсасгс ьпс 11гас с1пе; то1й 1пгс(); гт рпЫ(с: чо1й 11(); г! то1й Гп(); Рождение С++ ИИИИИИИй Каждая функция-член при этом выглядела бы примерно так: чоЫ Х:;Е1() ( ЕЕ (Е1гвс сгае == О) ( Епхс(); Е1гвс с1ие = 1; // ) Накладные расходы для таких простых функций, как вывод одного символа, могут оказаться слишком велики. В новом дизайне потокового ввода/вывода (см. раздел 8.3.1) Джерри Шварц () епу ЯсЬтчагх) применил хитроумный вариант этого приема [ЗсЬзчагх, 19891 Заголовок <1овСхеагп.

Характеристики

Тип файла
DJVU-файл
Размер
2,78 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6430
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее