А.В.Столяров. Введение в язык Си++АннотацияКраткое (объём пятого издания — 156 страниц) введение в язык Си++. Содержание построено по принципу плавного перехода от средств чистого Си: в начале даётся определение ООП как парадигмы, основанной на обмене сообщениями, затем вводится метод для обычной открытой структуры, уже после этого рассказывается о защите и её предназначении, затем (поскольку теперь это необходимо) вводятся конструкторы и деструкторы, и т.д. Так называемая "стандартная библиотека" Си++ (известная также под названием STL) в книге не упоминается вообще, поскольку если начать изучение Си++ с STL, есть риск никогда не узнать сам язык. Для ввода-вывода в примерах используются функции библиотеки Си (printf и др.) Кроме того, в книге сознательно игнорируются все «усовершенствования», предлагаемые авторами так называемых «стандартов». В пятом издании незначительно изменена рубрикация, добавлены несколько новых параграфов, исправлен ряд обнаруженных ошибок и полностью переработан текст предисловий. Публикация в бумажном вариантеПятое издание опубликовано издательством МАКС Пресс (Москва) в 2020 году. ISBN 978-5-317-06294-1. Четвёртое издание опубликовано издательством МАКС Пресс (Москва) в 2018 году. ISBN 978-5-317-05781-7. Третье издание опубликовано издательством МАКС Пресс (Москва) в 2012 году. Книга издана при поддержке компании Юниконтроллерз. Второе издание опубликовано издательством МАКС Пресс (Москва) в 2011 году. ISBN 978-5-317-03552-5. Первое издание публиковалось РИО МГТУ ГА в 2008 г. под заголовком «Методы и средства визуального проектирования. Раздел "введение в язык C++"». ISBN 978-5-86311-660-0 Электронная версияЭлектронная версия пятого издания, идентичная печатной версии, доступна здесь: http://www.stolyarov.info/books/pdf/cppintro5.pdf Электронная версия четвёртого издания, идентичная печатной версии, доступна здесь: http://www.stolyarov.info/books/pdf/cppintro4.pdf Электронная версия третьего издания, идентичная печатной версии, доступна здесь: http://www.stolyarov.info/books/pdf/cppintro3.pdf Электронная версия второго издания доступна здесь: http://www.stolyarov.info/books/pdf/cppintro2.pdf Электронная версия первого издания доступна здесь: http://www.stolyarov.info/books/pdf/cppintro.pdf Внимание! В старых версиях имеются известные автору фактические ошибки! Статус бумажной версииВ настоящее время может быть приобретена в здании факультета ВМК, а также заказана с доставкой на этом сайте |
пояснениеВы находитесь на официальном сайте Андрея Викторовича Столярова, автора учебных пособий по программированию и информационным технологиям. Если вы искали сайт замечательного писателя-фантаста Андрея Михайловича Столярова, то вам, к сожалению, не сюда. Андрей Михайлович Столяров в библиотеке Мошкова |
☞ From ScrollLock (unverified) Tue Jul 9 16:49:23 2024 UTC
Zero Runtime в C++
В книге "Введение в язык C++" на стр. 52 говорится о невозможности вынести из языка работу с динамической памятью. И в гостевой книге Вы писали о том, что в идеальном языке это должно делаться с помощью макропроцессора. Оказывается, что в C++ такая возможность поддерживается с помощью перегрузки new и delete, в которых можно помещать свою реализацию кучи. Сколько именно вариантов операторов new и delete надо перегрузить - может зависеть от настроек компилятора (стандарта языка). И если отключить RTTI и исключения и не пользоваться STL - то до состояния Zero Runtime/Bare Metal остаётся написать "заглушки" для ещё 1-2 функций из библиотеки языка для работы с виртуальными функциями. Мне это было надо не только как этюд, но и для компиляции плагинов на C++ для MATLAB с помощью MinGW, без этих ухищрений взаимодействие run-time MinGW и MSVC приводило к неустойчивой работе MATLAB.
ответить
From Andrey V. Stolyarov Wed Jul 10 13:23:05 2024 UTC
Re: Zero Runtime в C++
При определённых ухищрениях подобное можно и для того же Free Pascal сделать, но это никоим образом не делает Free Pascal языком zero runtime.
ответить
From ScrollLock (unverified) Wed Jul 10 15:04:13 2024 UTC
Re: Re: Zero Runtime в C++
Во Free Pascal зависящие от библиотек возможности не столь очевидно отделены от самого языка. Тот же ввод-вывод, строки, динамическая память, RTTI и исключения. При написании "zero runtime" динамической библиотеки на несколько тысяч строк на подмножестве C++ у меня не осталось впечатления того, что это какие-то сложные "ухищрения": из-за отсутствия функции main даже ассемблерные вставки не поднадобились. Одиночное наследование, new/delete, виртуальные функции и перегрузка операций с ключом линковщика -nostdlib и ключами компилятора -fno-builtin, -fno-rtti и -fno-exceptions нормально работали. Правда то, что подобное можно сделать с C++, мне стало очевидным именно после примера с Си и рассуждений про zero runtime из Ваших книг.
Поддерживаемое в таком режиме подмножество языка шире описанного у Вас: работают namespaces, constexpr, override, типы из cstdint и большинство операций с ними, initializer_list.
ответить
From Andrey V. Stolyarov Wed Jul 10 15:14:31 2024 UTC
Re: Re: Re: Zero Runtime в C++
> работают namespaces, constexpr, override, типы из cstdint и большинство операций с ними, initializer_list.
Всю эту комитетскую мерзость я забанил не из-за рантайма, а из-за того, что это комитетская мерзость. Вот просто, раз и навсегда: всё, что порождено комитетами, должно быть забанено, точка, всё, полезность и вредность отдельных фич оценке не подлежит.
Вообще если у вас рука поднялась сделать #include <cstdint> (а не stdint.h, что вообще-то тоже недопустимо, но хотя бы не до такой степени, что ли) — то я не вижу, о чём мне тут с вами разговаривать.
ответить
From ScrollLock (unverified) Wed Jul 10 16:30:36 2024 UTC
Re: Re: Re: Re: Zero Runtime в C++
stdint.h (для меня он предпочтительнее cstdint, т.к. точно объявляет типы глобально, не в std) тоже недопустим из-за того, что он от комитетов пришёл в C99 и затем в C++11 вместе с cstdint? Но не вполне понятно, каковы для него простые альтернативы. В старых кроссплатформенных программах, нуждающихся в типах известной разрядности, для этого приходилось писать довольно длинные и страхолюдные макросы с проверками ОС, разрядности системы, версий компиляторов и т.п.
Наверное, для ухода от комитетов нужны действительно разработки каких-то новых языков системного программирования, обозримых одним человеком или небольшой группой людей.
ответить
From Andrey V. Stolyarov Thu Jul 11 19:46:45 2024 UTC
Re: Re: Re: Re: Re: Zero Runtime в C++
> stdint.h [...] тоже недопустим
Разумеется, недопустим. И не только потому, что он из стандартов, но и потому, что сама идея этого хидера сугубо дебильна.
> каковы для него простые альтернативы
Подобным высерам комитетского мышления альтернатива ровно одна: их отсутствие.
> В старых кроссплатформенных программах, нуждающихся в типах известной разрядности, для этого приходилось писать довольно длинные и страхолюдные макросы с проверками ОС, разрядности системы, версий компиляторов и т.п.
А вот не надо пиздёж не по делу разводить, а? Или свой собственный сайт сделай и там разводи, а тут не надо.
Если по делу: восемь бит — это всегда char, если char не восемь бит — компилятор надо выкинуть на помойку, а его создателей срочно госпитализировать. Далее, short всегда 16 бит, вот вообще всегда, без вариантов. Ну и long long, если он есть (а он вообще-то всегда есть) — это 64 бита.
Остаётся многострадальное 32-битное целое, с которым реально возможны проблемы. В подавляющем большинстве случаев годится обычный int, но увы, иногда этот номер не проходит и int внезапно оказывается 16-битный (других вариантов не бывает, и не надо про них рассказывать сказки). Ну так сделать, если уж припёрло, один тайпдеф и один макрос:
— и использовать на здоровье этот i32 везде в программе. А когда попадётся компилятор и целевая платформа, комбинация которых делает int чем-то отличным от 32-битного (и, блядь, не раньше!!! ибо такое встречается разве что при компиляции для MSDOS, Win16 и некоторые малохольные микроконтроллеры, с которыми никакой переносимости всё равно быть не может, чушь это всё) — вот если таки нарвались, то добавить в командную строку компилятора (например, через переменную CXXFLAGS в Makefile) сакраментальное
-DMYPROGRAMNAME_INT32=long
. И всё. ВСЁ!!!> Наверное, для ухода от комитетов нужны действительно
Лично мне для "ухода от комитетов" потребовалось ровно одно: осознать, что в комитетах не бывает лиц, отличных от конченных мудаков. А в целом есть один простой принцип: кто хочет делать — ищет возможности, а кто не хочет — ищет причины.
ответить
From ScrollLock (unverified) Thu Jul 11 21:40:04 2024 UTC
Re: Re: Re: Re: Re: Re: Zero Runtime в C++
Под "страхолюдными макросами" я имел в виду два конкретных примера: tmwtypes.h из поставки MATLAB (типы фиксированной разрядности) и mem.h из библиотеки qhull (целое размером с указатель, им надо было для расчёта каких-то хешей). Разработчики MATLAB сделали всё максимально кондово на основе limits.h ещё из K&R:
И далее в том же духе доходят до определения типов фиксированной разрядности. Получилось громоздко, но универсально и не требующее дополнительных ключей компилятора и раздумий пользователя даже в редких случаях. Там даже есть проверка char на 16-битность и 32-битность для совсем "отбитых" компиляторов. И рассуждения в комментариях на разные темы, например: 1) что заголовочный файл должен хотя бы частично работать даже для 8-битного int и 16-битного long; 2) если для данного числа бить подходит несколько типов языка - то надо назначать прежде всего int, чтобы компилятор выдавал поменьше предупреждений при приведении типов. Но их код - он наверняка "помнит" и DOS16, и Win16, какие-то не x86 архитектуры, экзотические компиляторы и т.п. И рассчитан в том числе на микроконтроллеры. Ради интереса открыл stdint.h из tdm-gcc, и он ощутимо короче tmwtypes.h, т.к. не пытается "угадать" ряд вещей и не считает, что "тамада хороший и конкурсы интересные".
В qhull для введения аналога intptr_t сделали так:
Здесь всё значительно менее универсально и основано на знании особенностей конкретных компиляторов конкретных платформ. Впрочем, основные проблемы тут с Windows.
ответить
From Andrey V. Stolyarov Fri Jul 12 08:28:35 2024 UTC
Re: Zero Runtime в C++
> # if INT_MAX == 0x7FL
Так не бывает, понимаете? Никогда, нигде. Выжопись подобного рода бессмысленна.
> typedef long long ptr_intT;
Если я правильно помню, intptr_t — это целое такой разрядности, чтобы при преобразовании в него указателей не терялась информация. Во всех нормальных компиляторах это long, была даже апокрифическая спецификация на эту тему, что-то вроде L64, подробностей не помню. Опять-таки, для случаев сборки под ненормальные (читай — форточные) варианты надо не пыжиться внутри исходников что-то там учитывать, а отдать это на откуп тому, кто будет собирать, т.е. написать в документации что-то вроде "если ваш компилятор то-то и то-то, то добавьте в командной строке вот такой флаг". В этом случае проблем будет намного меньше (поскольку всё равно всего не предусмотреть) и, самое главное, проблемы будут решаться не раньше, чем они реально возникнут.
Подход долбаных комитетчиков — а давайте тут проголосуем и весь мир заставим использовать это уродство, чтобы решить якобы-проблему, которую "вроде я слышал дядя вася в молодости пару раз встретил" — это безответственный дебилизм, как, впрочем, и всё, что делается комитетами.
ответить
From ScrollLock (unverified) Fri Jul 12 12:01:20 2024 UTC
Re: Re: Zero Runtime в C++
Я прекрасно понимаю, что нарваться на 8-разрядный int практически нереально. Но саму идею вполне можно использовать для автоматического различения между 16- и 32-разрядными int-ами, и это даже будет компактно, понятно и совместимо с C89.
>> что-то вроде L64
Для UNIX-подобных - обычно LP64, и там long 64-битный. А вот под Win64 что в MinGW, что в MSVC (но не в Cygwin) используют LLP64 и там long 32-битный. Может, оно и не очень нормально, но точно не экзотика, и кросс-платформенной программе это придётся учесть. Оставлять такое без "защиты от дурака" лично я бы не стал, и её надо делать в run-time: различить ILP32, LLP64 и LP64 в рамках ANSI C в compile-time, похоже, нельзя. Но на современных платформах без сегментации указатель наверняка поместится в size_t, который есть в ANSI C и точно упоминается во втором, прижизненном издании K&R в главах 6, 7 и приложениях.
Так что без stdint.h (но не без limits.h и без stddef.h), похоже, можно обойтись достаточно легко даже без ручных настроек ключей компилятора.
>> а отдать это на откуп тому, кто будет собирать, т.е. написать в документации
Плохо то, что это указание в документации легко не заметить. И приведёт ли это к ошибкам в ран-тайме или нет - зависит от того, в стеке или в куче создан объект, работаем в EXE или в DLL и т.п. С тем, что "всё предусмотреть нельзя" столкнулся именно при сборке qhull 64-битным MinGW из-за недочётов в их директивах условной компиляции. От "шрединбага" тогда спасла только их встроенная защита, в ран-тайме проверяющая нужные sizeof и останавливающая программу при неудаче. Применять size_t в багфиксе разработчики qhull не стали, т.к. им нужна была совместимость с какими-то древними компиляторами.
ответить
From Andrey V. Stolyarov Fri Jul 12 12:17:38 2024 UTC
Re: Re: Re: Zero Runtime в C++
Идея проверять подобное во время исполнения вообще не должна приходить в голову, есть вещи, которые просто нельзя и всё.
size_t, кстати, тоже нельзя и всё. Как и limits.h, как и stddef.h.
Пожалуй, предложением что-то проверять в рантайме вы свой кредит моего терпения исчерпали, можете не тратить время на дальнейшие комментарии — я их больше не раскрою.
ответить
☞ From Anonymous (unverified) Sun Jun 9 22:29:15 2024 UTC
RTTI в исключениях?
Разве исключения требуют RTTI? Вроде как исключения работают и с -fno-rtti.
ответить
From Andrey V. Stolyarov Mon Jun 10 08:47:15 2024 UTC
Re: RTTI в исключениях?
Насколько я понимаю, реализация идентификации типов там используется одна и та же, т.е. если RTTI выключить, а исключения оставить, то всякое typeof и type_info работать перестанет, но прилинкованный жирнющий кусок рантайма никуда не денется.
ответить
☞ From Александр (unverified) Fri Sep 22 06:07:35 2023 UTC
Благодарность
Хочу выразить своё полное согласие с автором. Попал на этот сайт случайно, хотя вот уже за 2 года где только не побывал. На старости лет решил заняться тем, на что в молодости времени не хватало. Собираю по крупицам то, что мне нужно для полного понимания темы. И да, пока сам своими руками и мозгами не начнёшь регулярно доводить до ума задумки, толку ни от книжек, ни от именитости авторов не будет. Это я знаю ещё по бейсику. Да, можно и обезъяну научить набирать текст на клавиатуре, но научить мыслить и разбираться досконально, может только природное упрямство и любопытство. Стоит один раз подсесть на этот "наркотик" и хлеба не надо. Наверное поэтому часто программистов изображают похожими на наркоманов: небритые, немытые, нечёсаные, постоянно ищущие "дозу", с диким взглядом, выражающим восторг от процесса. Это посильней чем в игрушки резаться. Игры снимают напряжение и отвлекают при заминках, дают понять насколько ты проголодался. В 1990-м комп был только на работе, поэтому в нерабочее время я ваял на бумаге и с нетерпением рвался на работу чтобы припасть к компьютеру. Только так я понял что бейсик очень слабоват для моих идей, но научиться серьёзному возможности не было, не было этого Си ни на компе, ни в книжном магазине. Спустя 6 лет возможность появилась, но не было времени на самостоятельное освоение. Так дожил до пенсии, аки пчела, всё в трудах и заботах. Как говорится, живы будем - не помрём, да и что такое 60 лет, в библии сказано: да будет жизнь человеков 120 лет. Всё ещё впереди
ответить
From Andrey V. Stolyarov Fri Sep 22 11:16:10 2023 UTC
Re: Благодарность
Всё бы хорошо, но книжку вы выбрали явно не ту. Обратите внимание на трёхтомник, и я настоятельно советую начать с первого тома. Часть по C++ в трёхтомнике тоже есть, и как раз из этой вот книжки сделана, только она почти что в самом конце — в третьем томе.
ответить
☞ From Рома (unverified) Tue Mar 21 03:50:45 2023 UTC
Формат электронной версии книги
Было бы просто замечательно, если бы Ваши книги были также доступны в формате EPUB
ответить
From admin Tue Mar 21 09:21:20 2023 UTC
FAQ, конечно, не читаем, куда там
Как уже неоднократно говорилось, ни о каких других форматах не может быть речи. Разве что djvu без текстового слоя.
ответить
☞ From olejan (unverified) Sat Jun 5 06:33:00 2021 UTC
Спасибо за ваши
Спасибо за ваши книги.
В одной из ваших книг вы говорите, что назрела необходимось в новом языке, который заменит C++.
Какими особенностями должен обладать этот новый язык с вашей точки зрения?
ответить
From admin Sat Jun 5 09:48:55 2021 UTC
Довольно
Довольно сложный вопрос, в одном комменте на него не ответить. Если вкратце, то сам язык должен быть низкоуровневым, то есть ниже уровнем, чем тот же Си — я даже подозреваю, что компилятор не должен фиксировать конвенцию вызова подпрограмм, то есть чтобы можно было её описать средствами языка. При этом в языке должны быть развитые средства для порождения абстракций уровня сколь угодно высокого, в том числе, несомненно, развитый (а не такой, как в Си) макропроцессор (если что, шаблоны Си++ я считаю именно макросами, а не чем-то иным, что бы там Страуструп на эту тему ни верещал).
Если говорить конкретно о Си++, то из его истории нужно извлечь некоторые уроки. Во-первых, перегрузка символов арифметических операций должна делаться не функциями, а макросами; во-вторых, конструкторы и деструкторы должны иметь произвольные имена, а их особая роль должна определяться ключевыми словами. Всё это позволит выкинуть за борт перегрузку функций, а вместе с ней и контринтуитивные правила видимости, и монстра по имени манглинг. В-третьих, механизм виртуальных функций должен быть вытеснен в библиотеку, и туда же должны уйти операции по выделению и освобождению динамической памяти; при развитом макропроцессоре это несложно. Ну и в-четвёртых, this должен быть ссылкой, а не указателем. Это так, навскидку; наверняка что-нибудь ещё можно припомнить.
Ну и ещё один момент: слово "стандартный" должно быть с самого начала объявлено категорическим табу. Никаких "стандартных библиотек", наоборот: как можно больше библиотек, конкурирующих между собой — их многообразие может взять на себя ту роль, которую сейчас играет многообразие самих языков. Ну и, конечно, никаких "стандартов", никаких комитетов и т.п.
ответить
☞ From Anonymous (unverified) Thu Apr 15 14:40:00 2021 UTC
Ozon? Really?
Посоветовал коллегам данную методичку для ознакомления с языком, а в ответ узнал, что она продаётся на Ozon. O_o
https://www.ozon.ru/product/vvedenie-v-yazyk-si-pyatoe-izdanie-stolyarov-a-v-248921978
ответить
From admin Thu Apr 15 16:53:00 2021 UTC
Бугага, 957
Бугага, 957 рублей :-) Напоминает налог на неумение искать в интернете.
Обратите внимание, что на этом сайте всё по-прежнему есть, включая электронную версию. Спасибо за ссылку, весьма любопытно :-)
ответить
From Parthen Thu Apr 15 17:49:00 2021 UTC
И все же, она с
И все же, она с вашего ведома продается?
Потому что Озон хоть и торгует электронкой, эту книгу в электронке не продает.
ответить
From admin Thu Apr 15 18:09:00 2021 UTC
Разумеется, не
Разумеется, не продаёт — права торговать моими книгами в электронном виде я никому не дам никогда и ни при каких условиях, а если такое всё же случится — можете быть уверены, что меня подменили рептилоиды.
Что касается продажи бумажной книги — то моего "ведома" тут не нужно, это обычный материальный объект. У меня эту книжку купили оптом (не буду уточнять кто, тут это неважно), теперь вон продают в розницу, в принципе имеют право, наверное, почему нет? Тем, кто купил, я весьма признателен, поскольку с закрытием единственной торговой точки, где эта книга продавалась, у меня нарисовался неиллюзорный шанс так и остаться с кучей этих книжек. Что книга будет продаваться конкретно на "Озоне", мне не сказали, но мне в целом плевать, где конкретно она продаётся, если у меня её уже купили.
ответить
From Parthen Fri Apr 16 10:20:00 2021 UTC
Спрашивается,
Спрашивается, зачем тут нужен посредник, если можно продать сразу в магазины?
Или они у вас не берут?
ответить
From admin Fri Apr 16 11:36:05 2021 UTC
Не берут,
Не берут, разумеется. Магазинам намного проще работать с крупняком. Я вам такую вещь скажу, магазины не только у меня не берут, но даже у того издательства, где выходят мои книжки — видимо, оно для них тоже слишком мелкое.
ответить
☞ From Angor (unverified) Sat Mar 14 20:56:00 2020 UTC
"Если вы знаете
"Если вы знаете людей, которые используют в программе на Си++ модули из какого-нибудь еще языка, кроме Си и ассемблера, сообщите о них автору книги, ему было бы интересно на них посмотреть."
А между тем, таких людей довольно много, по-крайней мере было. Дело в том, что когда Borland выпускала свой C++ Builder, ей было влом переписывать библиотеку VCL, изначально написанную на Object Pascal-е. Им было проще допилить компилятор Delphi, чтобы он при компиляции модулей генерировал кроме объектных файлов еще и заголовочные файлы для Си++ и вуаля, в С++ используется написанная на паскале библиотека.
ответить
From admin Sun Mar 15 08:54:04 2020 UTC
Спасибо, не знал
Спасибо, не знал
ответить
From Anonymous (unverified) Sun May 16 23:12:00 2021 UTC
Фортран
Фортран библиотеки еще часто из C++ зовутся. Канонический пример -- вызов функций библиотеки arpack (нахождение спектра оператора) из расчетной программы, написанной на C++.
ответить
☞ From Anonymous (unverified) Tue Feb 18 22:02:00 2020 UTC
Опечатка
Страница 124:
"В классе GraphObject методы Show и Hide мы объявлены как чисто виртуальные, ..."
P.S.: очень сложная капча
ответить
From admin Wed Feb 19 10:42:54 2020 UTC
Спасибо
Поправил. У этой опечатки были реальные шансы попасть в текст четвёртого тома, который сейчас корректор вычитывает (корректоры не всемогущи, так что спасибо ещё раз).
Насчёт капчи -- я знаю, но, увы, попытки ослабить её приводят к тому, что рука устаёт спам вычищать. В друпале это сделано не очень удобно. NB: здесь на сайте можно зарегистрироваться (на страничке гостевой книги), зарегистрированным пользователям капчу не показывают.
ответить
☞ From Paul (unverified) Mon Jan 6 18:37:00 2020 UTC
Не баг а фича?
Приветствую! Сейчас разбирал пример SparseArrayInt и возник вопрос. В функциях Provide и Remove в качестве аргумента передаётся индекс, однако в теле функции он не фигурирует, а также данный аргумент не указан в приведённом коде в книге (5 издание). Соответственно вопрос, это баг или фича?
ответить
From admin Mon Jan 6 22:39:31 2020 UTC
Что-то этому примеру не везёт
Это однозначно баг, нужно разбираться.
ответить
☞ From Alexander (unverified) Sat Dec 28 20:07:00 2019 UTC
Переход на ++
Добрый вечер Андрей Викторович, появилась необходимость переходить на С++, начал перечитывать ваше 5 издание понимаю, что могу ответить на 3 поставленных вопроса, но не знаю с чего начать, подскажите, где можно посмотреть хорошую реализацию не сложных программ или как правильно проектировать классы, пока нет опыта?
ответить
From admin Sun Dec 29 10:52:33 2019 UTC
Я не совсем
Я не совсем понимаю, как могут сочетаться тезисы "появилась необходимость переходить на С++" и "не знаю с чего начать". Если перед вами встала практическая задача, ради которой нужно перейти на C++, то с этой задачи и начните. Если такой задачи нет, то, увы, всё плохо.
К сожалению, на вопрос "как правильно проектировать классы" внятного ответа не существует. Многочисленные попытки такой ответ дать по своему эффекту варьируются от безобидных (но бесполезных) вроде Гради Буча с его "ООП в действии" до откровенно вредоносных вроде "Паттернов" от "банды четырёх".
ответить
☞ From Александр (unverified) Fri Apr 12 00:48:00 2019 UTC
Дети наше всё
Здравствуйте, я хочу обучать ребенка программированию, выбрал язык си++ , сам я с ним не знаком, но какие то минимальные представления о программировании имею. буквально вчера показал ему видео обучение на ютубе и он успел пройти несколько "уроков".
ссылка на обучение - [url removed]
тут все рассказывается очень подробно, я сам успел посмотреть где то до 5 урока
но сегодня попалась на глаза Ваша книга, где Вы настойчиво рекомендуете не использовать iostream
Я не хочу допустить ошибку при обучении ребенка, что бы потом ему не пришлось переучиваться.
Хочу Вас просить порекомендовать с чего начать обучение в принципе. Есть ли какие то пособия или программы для детей. Лучше всего мне кажется будет восприниматься видеоматериал, с обучением на графических примерах т.е. моделирование движения планет или какие то простые игры типа змейки, тетриса и т.д.
Самостоятельно очень тяжело найти полезную информацию, мы с ним пробуем разобраться с ардуино (кое что получается), так же ребенок балуется со Scratch. Ему интересно и он сам просит большего, а я боюсь ошибиться и научить его неправильно мыслить.
О себе:
мне 38 лет, сыну 12 лет. Живем в селе, и каких то кружков или клубов по интересам здесь нет, по этому приходиться изучать самостоятельно.
Очень надеюсь на Ваши советы.
ответить
From admin Sat Apr 13 22:05:00 2019 UTC
Какой там к
Какой там к дьяволу iostream?! Начав обучение с C++, вы ребёнка угробите без вариантов и без каких-либо шансов на восстановление, то есть в серьёзное программирование закроете ему дорогу полностью и навсегда. На фоне этого iostream превращается в несущественную деталь.
Вообще если уж вы на мой сайт пришли, есть, наверное, смысл сначала прочитать, что тут в книжках написано, а уж потом задавать вопросы. Рекомендую взять первый том "Введения в профессию" и прочитать хотя бы предисловия.
Ссылку на "уроки" из вашего коммента убираю; если хоть один человек пойдёт по этой мерзости учиться по ссылке с моего сайта — гореть мне в аду, хоть я в бога и не верю.
ответить
☞ From yuri (unverified) Thu Mar 28 17:25:00 2019 UTC
C++ и STL
Здравствуйте, Андрей Викторович.
Возникла вот тут такая проблема. Я на вашем сайте, можно сказать, уже давно, и про STL уже прочитал достаточно.
Так получилось, что сравнительно недавно начал разработку программы по химической тематике. Показал первые модули "наставнику", после чего тот одобрил, но "настоятельно рекомендовал библиотеку STL", ведь там есть двусвязные списки, динамические массивы и сортировки, которые я писал вручную, мол, это ускорит вам разработку.
С одной стороны, я внял вашему совету не использовать STL на первых порах, и изменять этому своему решению совсем не стремлюсь.
С другой стороны, возразить нечего, ведь писать самому разных рядовых, скажем так, вещей действительно придётся меньше.
Что вы думаете по этому поводу? На данный момент я аргументированно обосновать отказ от STL не могу, лишь слушаю умных людей (ну то есть вас).
Попробовать всё-таки STL, чтобы всё-таки понять, почему лучше его отбросить куда подальше?
ответить
From admin Sat Mar 30 23:49:00 2019 UTC
Возразить вам
Возразить вам вообще-то уже должно быть что. Давно пора понять одну простую вещь: нет, STL не экономит время. Наоборот, его использование ведёт к катастрофическим потерям. Просто эти потери вытесняются со стадии кодирования (замечу, самой простой в жизненном цикле программы) на стадии отладки и сопровождения. И, самое главное, вытесняются не просто без пользы, но обычно с кошмарным проигрышем — экономия пяти минут на стадии кодирования зачастую оборачивается потерями недель в ходе сопровождения.
Пробовать STL я бы рекомендовал не раньше, чем вы почувствуете себя в C++ достаточно уверенно — то есть, скажем, после десятка тысяч строк.
ответить
☞ From AIGERIM (unverified) Thu Mar 21 02:32:00 2019 UTC
Zdravstvuite! uchus` v
Zdravstvuite! uchus` v universitete na programmista. Izuchaiu c++. No mnogoe ne ponimaiu. Xochu nachat` samostoyatel`noe izuchenie, podskajite pojaluista, s chego nachat`? Kakoi uchebnik mozhete posovetovat`? Pryam s samogo nachala. Spasibo.=)
ответить
From admin Thu Mar 21 21:54:00 2019 UTC
Если бы в мире
Если бы в мире существовал учебник, который я мог бы посоветовать, то писать свой я бы не стал. Так что добро пожаловать в первый том. Остальное (с чего начать и всё прочее) — в его предисловиях.
Поскольку мы тут находимся на страничке книжки про C++, на всякий случай подчеркну, что до C++ от начала обучения — по меньшей мере два-три года.
ответить
☞ From syscaller (unverified) Tue Mar 12 09:50:00 2019 UTC
Здравствуйте!Д
Здравствуйте!
Должно быть это опечатка, на стр. 31 на второй строчке слово "про-русски"?
ответить
From admin Tue Mar 12 18:25:40 2019 UTC
Спасибо!
Весьма своевременно: ещё бы немного, и эта опечатка получила бы шанс оказаться в тексте четвёртого тома "Введения в профессию". Ну, если бы её корректор не заметил, но практика показывает, что корректоры тоже не боги.
ответить
☞ From Sergei (unverified) Sat Mar 2 22:12:00 2019 UTC
Параметры шаблона
На странице 134 утверждается, что C++ допускает шаблоны с вещественнозначными параметрами (типа double). Насколько мне известно, это неверно. Вроде бы даже и по стандарту (хотя тут с уверенностью сложно утверждать, слишком уж много там текста), но как минимум ни один из широко используемых компиляторов (gcc, clang, msvc) такого не допускает. С другой стороны, целочисленные параметры допускаются любого типа (int, unsigned int, char, и т.д, и даже bool).
P.S. Интересно, существует ли способ отличить ситуацию, когда комментарий ещё не был просмотрен или затерялся от ситуации, когда он не прошёл премодерацию?
ответить
From admin Sun Mar 3 13:05:59 2019 UTC
Вы совершенно правы
Эта ошибка должна была быть исправлена перед выходом четвёртого издания, но я про неё ухитрился забыть (хотя в моём экземпляре третьего издания это место помечено стикером, как и другие обнаруженные огрехи).
Спасибо! В текст четвёртого тома эта чушь теперь точно не пройдёт.
существует ли способ отличить ситуацию, когда комментарий ещё не был просмотрен или затерялся от ситуации, когда он не прошёл премодерацию?
Формально говоря, такого способа нет; но комментариев тут оставляют не так много, так что я вполне успеваю их все просмотреть. Раскрываю я при этом только те, на которые хочу ответить, либо которые по тем или иным причинам хочу видеть раскрытыми.
Если ответить на комментарий у меня желания не возникает, обычно этот комментарий остаётся закрытым.
ответить
☞ From Anonymous (unverified) Mon Jan 7 09:44:00 2019 UTC
Практика программирования
В книгах Вы неоднократно повторяете, что для того, чтобы научиться программировать нужна практика. Посоветуйте пожалуйста где ее можно приобрести.
P.S.
Пробовал следующие варианты:
Они олимпиадные задачи и CTF подразумевают решение задач за ограниченное время, поэтому на них не получается отработать некоторые навыки (например создавать абстрактный класс было бы бессмысленно)
В opensource проектах, требуется скорее поиск ошибок в чужом коде, а это не то, что нужно.
ответить
From admin Thu Jan 10 17:20:00 2019 UTC
Если хотите
Если хотите быть программистом, т.е. таким человеком, который пишет компьютерные программы на профессиональном уровне, то про олимпиады и CTF забудьте вообще, совсем и навсегда. Там закрепляются такие привычки, которые для программиста губительны.
Самый главный источник практических задач — собственная практическая работа. В этом плане для начала ответьте на простой вопрос: является ли командная строка Unix для вас основным средством взаимодействия с компьютером. Если нет — то я вам ничем помочь не могу (см. т.1, стр. 30); если же да, то мне крайне странно слышать о каких бы то ни было трудностях с поиском практической задачи; повседневная работа с командной строкой ставит такие задачи едва ли не по пять раз на дню.
И ещё один момент: если у вас нет практического опыта, то какого дьявола вы вообще делаете на страничке с книжкой по Си++?! ООП можно изучать не раньше, нежели появится свой собственный опыт разработки программ на две-три тысячи строк, а до той поры это не просто бессмысленно, но даже скорее вредно.
ответить
☞ From Alexey (unverified) Sat Jun 17 19:22:00 2017 UTC
Использование errno при создании FileException
Здравствуйте!
Прежде всего, спасибо за книгу и за то, что свободно её распространяете!
В параграфе 3.6 приведён следующий код:
FileException::FileException(const char *fn, const char *cmt)
{
filename = strdup(fn);
comment = strdup(cmt);
err_code = errno;
}
[...]
char* FileException::strdup(const char *str) {
char *res = new[strlen(str)+1];
strcpy(res, str);
return res;
}
Предполагается, что конструктор записывает в поле
err_code
код ошибки некоторой функции, вызванной непосредственно до вызова конструктора. Но для этого необходимо гарантировать, чтоFileException::strdup()
не изменитerrno
.Стандарт Си++ не говорит ничего об
errno
в описании семантики оператораnew
(C++2003, 3.7.3.1 Allocation functions), но в сноске 32 написано:The intent is to have operator new() implementable by calling malloc() or calloc().
В свою очередь, стандарт Си говорит следующее об
errno
(C99, 7.5 Errors):The value of
errno
may be set to nonzero by a library function callwhether or not there is an error, provided the use of
errno
is not documented in thedescription of the function in this International Standard.
В описании
malloc()
С99 не говорит ничего обerrno
(7.20.3.3).POSIX об
errno
говорит следующее:The setting of errno after a successful call to a function is unspecified unless the description of that function specifies that errno shall not be modified.
POSIX не специфицирует значение
errno
в случае успехаmalloc()
.Не считаете ли вы, что в данном случае лучше просто добавить ещё один параметр для кода ошибки в конструктор
FileException
, убрав тем самым его неявную зависимость от глобального состояния?ответить
From admin Mon Jun 19 08:54:42 2017 UTC
Как говорят, good catch
С одной стороны, к стандартам я известно как отношусь, а в реальности успешный malloc никогда не меняет errno, а неуспешных malloc'ов не бывает :-)
С другой стороны, можно errno присваивать не третьей строчкой тела конструктора, а первой; описанную вами проблему это решит. Вводить для неё параметр мне удачной идеей не кажется: при throw каждый раз придётся лишнее слово писать, документировать его и всё прочее.
ответить
☞ From Pavel (unverified) Thu Nov 17 14:18:00 2016 UTC
опечатка?
Добрый день, уважаемый Андрей Викторович.
Большое спасибо за замечательную книгу! Использую её в своей практике для обучения студентов, очень помогает.
Замечена опечатка на стр. 68. Вместо этого:
int A::the_static_field = 0;
надо, по всей видимости, писать так:
int Cls::the_static_field = 0;
ответить
From admin Fri Nov 18 16:49:27 2016 UTC
Большое спасибо!
Действительно ошибка в тексте, и до вас её никто не замечал, то есть ещё бы немножко — и она ровно в таком виде оказалась бы в тексте четвёртого тома "Введения в профессию". Так что я вам очень признателен за сообщение.
ответить
From Pavel (unverified) Fri Jan 27 07:59:00 2017 UTC
Опечатки?
Добрый день!
Когда комментировал в прошлый раз не все разглядел. Возможно, это тоже опечатки.
1) Опечатки на странице 69.
Вместо:
A a;
a.the_static_field = 15; // правильно
A::the_static_field = 15; // тоже правильно
должно быть так:
Cls a;
Cls.the_static_field = 15; // правильно
Cls::the_static_field = 15; // тоже правильно
В тексте абзаца выше тоже есть упоминание необъявленного класса A (четвёртая строка сверху).
2) На странице 82 в статическом методе strdup класса FileException вместо:
char *res = new[strlen(str)+1];
должно быть:
char *res = new char[strlen(str)+1];
ответить
From admin Sun Feb 5 16:26:19 2017 UTC
Было такое
В ныне существующей версии рукописи (которая пойдёт в 4 том) всё это уже исправлено, только что проверил. Но всё равно большое спасибо!
ответить
☞ From Anonymous (unverified) Sun Aug 21 11:27:00 2016 UTC
Вставлю и свои
Вставлю и свои пять копеек.
На рутрекере видел эту книжку. Выложил кто-то. Так там к ней один из комментаторов отписал что-то навроде: "В книге используется stdio.h вместо iostream. Для кого автор пишет эту ерунду?". Честно говоря, настолько каким-то глупым и даже провокационным показался этот коммент (а не сам ли автор написал такое?!), что не поленился и скачал. Как выяснилось, книгу эту я уже видел. За издание точно не скажу (может, и не третье), но помню, что впечатление она оставила хорошее. Почему сюда и зашёл, на рутрекере отписываться просто смешно. И как оказывается, тут ещё и новые книги появились. А почему понравилась? Да потому, что она в отличие от многих книг по С++, ставящих всё с ног на голову, излагает языком точным, и совершенно очевидно, что автор ПОНИМАЕТ то, о чём говорит. Даются основы языка С++. Причём именно языка! А что ещё должно быть в книге, озаглавленной "Введение в С++"? И точно указан контингент - учащиеся, знающие язык Си. Всё пристойно, в рабочем режиме. Может, сравним с каким-нибудь другим учебником? Например, с учебником С++ Дятела? Что мы там имеем? Многотонный фолиант (на ногу уронить - пиши, пропало!), начинающийся с полюбившегося некоторым iostream'ного cout, выводящего "Hello, world". Разумеется, никакого предварительного знания языка Си не требуется, поскольку по заверению авторов, "он и сам собой изучится" по ходу пьесы, так что будете знать аж два языка! По довольно тщательному (размерно!) описанию циклов, условий, основных конструкций, становится очевидным, что авторы на полном серьёзе считают, что можно плюсам обучить с нуля! А язык-то, для профессионального пользователя! Программист - это профессия, которой учатся. Не один год. То есть, потенциальный читатель каким-то сверхъестественным образом (видимо, уже при рождении) должен знать с десяток-другой сопутствующих дисциплин. Не смешно? И кстати, если это всё-таки не так, зачем нужен С++ этого самому потенциальному читателю? Знание основ программирования на сегодняшний день - обязательное условие "общей" грамотности. Но не С++ же! Существует куча очень даже приличных языков, позволяющих как быстро освоить, так и успешно использовать их в решении своих проблем пользователям без специальной подготовки. А они читают книжку Дятела, который обещает (как и многочисленные курсы) не только знание языка С++ после завершения "обучения", но и всякие "высокооплачиваемые работы" не без блекджека! То есть, попросту теряют время. Или, может, Дятел этого не знает? Вообще-то, любой человек пишущий по теме "++" не может не являться профессиональным программистом! Стало быть, врёт? Ага! "Маркетинг" по-импортному называется, "мошенничество" по-русски. Кидалово. И благо бы был один такой Дятел, так их - просто полки магазинные ломятся! Так что, в печку всех этих дейтелов, в печку... Вслед за Каутским. Писал бы Булгаков в наши дни, его Швондер однозначно бы был автором учебника по плюсам. И ничуть дела не меняет то обстоятельство, что взявший эту книжку программист найдёт в ней что-то для себя полезное. На то он и программист - он уже умеет читать селективно и в состоянии грепнуть из текста именно то, что ему нужно. А остальное куда? Кстати, для программистов уже состоявшихся существует специальная литература. Максимум, во что может превратиться человек после чтения таких дейтелов, это (кто-то сверху, правда, сказал - "обезьяна", но будем гуманней к несчастным) девочка Маша (сходу такой образ нарисовался), которую взяли кладовщицей на громадных размеров складской терминал с кучей складов-контейнеров, где она ничего не знает, ни где чего лежит, ни для чего оно предназначено. Только что - молодая, бегает быстро! Вот только попроси эту Машу принести какой-нибудь инструмент, пригодный, скажем, для лесозаготовки, то она (поискав с полдня) садовые ножницы и принесёт. Здрасьте! А пройдут годы, поднаберётся опыта? Ну, станет бабой Машей, с тремя радикулитами, ковыляющей между своими контейнерами со скоростью в полузла, но зато прекрасно знающей что лежит в каком контейнере. Вот только попробуй опять собраться куда-нибудь лес попилить, да порубить, она тебе принесёт те же садовые ножницы, что и много лет назад...
Чего-то меня понесло... В общем, повезло тем читателям Столярова, кто на сегодня - студент. Слушай, что взрослый дядя говорит, да делай. Всего делов! Кстати, и не только студентам почитать-то можно - кто-то сверху очень правильно отметил, что изложение просто мозгинаместоставящее. У всех есть где-то какие-то пробелы, а текст "Введения в С++" достаточно короткий, чёткий и вменяемый. Ничуть не удивлюсь, если и обычный пользователь, для своих нужд уверенно пользующий какие-нибудь перлопитоны и работающий где-нибудь в отделе персонала, тоже вполне может поиметь что-то полезное - уж во-всяком случае, при приеме на работу "программиста", аналогичного рутрекеровскому любителю иостримов, вполне самостоятельно сможет поставить правильный диагноз и чётко отработать указателем на объект Двери, не отвлекая от работы людей, занятых программированием.
ответить
From admin Mon Aug 22 21:06:44 2016 UTC
Писал бы
Писал бы Булгаков в наши дни, его Швондер однозначно бы был автором учебника по плюсам.
Как говорят англоязычные товарищи, you made my day :-) Вот прямо в рамочку и на стену.
Ну и вообще спасибо за отзыв, не каждый день такое. А коммент тот на трекере я видел, да мало ли таких комментов в интернете.
ответить
☞ From Anonymous (unverified) Fri Aug 19 20:19:00 2016 UTC
Вообще-то...
Вообще-то, не раз случалось в течение жизни брать в руки какую-либо толстожопую книжку по "плюсам" с немалым желанием извлечь из неё нечто для себя нужное. Что-то как-то никогда сильно не шло... Давно уже принял для себя, что "по жизни" мне и Си - за глаза и за уши, максимальная по размеру программа не превышала десяти тысяч строк. "Плюсы" устойчиво ассоциировались с инструментом, необходимым лишь для проектов требующих десятков и сотен программирующих особей и задач, близких к космическим.
Однако, уже несколько самых первых строк Вашей книжки несколько изменили точку зрения. Аж с момента представления элементарной структуры, куда (надо же!) можно запихать относящуюся к ней функцию. Прямо не отходя от кассы взял свою же уже довольно старую программу и попробовал переписать. Интересные ощущения! Заместо висящих где-то функций, вдруг получилось нечто куда более структурированное и куда более понятное. А если верить, что "машинный код" от этого действа не изменяется, это совсем не так уж плохо! То есть, один "плюс" - уже налицо. За "второй", покамест, ничего сказать не могу. Поживём, увидим, может и приспособятся куда-нибудь эти самые "плюсы" со временем... Но по любому, написано так, что перевода с русского на русский не требует. Так что, однозначно, книжка пользователя имеет. Дело за малым - чтобы попала она в руки этому самому пользователю, который с полок магазинов сметает нечто куда более ненужное. Хорошее введение. Нужное.
Ну, а порадовавшие меня (чисто из общих и стилистических соображений!) штрафные в сторону ворот Степанова сотоварищи, наверно, тех, кто давно в "плюсах", порадовать и не могли - STL им нужен хотя бы уже потому, что спрашивать их при приёме на работу не будут не то, что о каких-то предпочтениях, но даже и о языке. На каком скажут, на таком и писать будут.
В общем, Введение хорошее. Спасибо.
ЗЫ Капча у Вас тоже неплохая, чёрт возьми...
ответить
From admin Sat Aug 20 19:07:00 2016 UTC
Спасибо :) А за
Спасибо :) А за капчу прошу прощения, без неё у меня руки устают спам стирать.
Насчёт машинного кода -- к сожалению, он не изменится только лишь в случае, если мы при компиляции выключим поддержку оработки исключений. В противном случае ради этих пресловутых исключений компилятор плюсов в начало и конец каждой функции запихивает кучу всего очень страшного.
ответить
☞ From Anonymous (unverified) Fri Apr 11 17:55:31 2014 UTC
Опечатка?
Андрей Викторович, возможно, на стр. 6 в сноске опечатка
"Любителям громких заявлений ОТ неотделимости стандартной библиотеки..."
ответить
From admin Wed Apr 16 14:41:23 2014 UTC
точно
да, вы правы, спасибо
ответить
☞ From Mr. Ali (unverified) Tue Feb 25 16:32:00 2014 UTC
Опечатка
Страница 103, нижняя половина. Абзац начинается так:
Когда переменная scene_lenght...
ответить
From admin Wed Feb 26 12:32:43 2014 UTC
Спасибо!
Болшое спасибо, эту опечатку вы заметили первым. Я пометил её в своём экземпляре, так что если дойдёт дело до четвёртого издания, там опечатка будет исправлена.
ответить
☞ From Jaroslav (unverified) Mon Nov 18 12:55:00 2013 UTC
Преобразование указателей
Спасибо большое за книгу!
Когда читал, одна вещь вызвала серьезные затруднения для понимания. Меня мучил такой вопрос: будет ли при private наследовании работать неявное преобразование указателей от указателя на наследника к указателю на предка? Я проверил и убедился, что не будет. На странице 90 есть фраза о том, что есть случаи, когда тот факт, что один класс унаследован от другого сам по себе является деталью реализации, но дальше в книге говорится только о защите методов и полей, а о преобразовании указателей не упоминается. Нельзя ли внести несколько слов в книгу о таком эффекте private наследования?
ответить
From admin Wed Nov 20 22:44:19 2013 UTC
приватное наследование
Дело в том, что вы не совсем правы. Неявное преобразование указателей будет работать там, где разрешено использование знания о том, что унаследованный класс является наследником своего предка. Например, если сделать некую функцию "другом" наследника, то внутри этой функции преобразование по закону полиморфизма работать будет: этой функции _разрешено_ знать, что наследование имеет место. То же самое будет происходить и, например, в методах наследника, включая статические — там это знание тоже разрешено.
В принципе, это напрямую следует из того, что сказано в книжке, но вообще я подумаю на тему отдельного замечания в этом плане.
Тут ещё такой момент есть, что в реальной жизни приватное наследование никогда не применяется — я, во всяком случае, ни разу с таким не сталкивался и с трудом представляю себе ситуации, когда оно зачем-то может понадобиться; ну а объём книжки хотелось бы сохранить небольшим. Есть ведь и более серьёзные вещи, которые в книжке полностью обойдены вниманием: namespaces, например, или множественное наследование, или там указатели на метод класса, да ещё много чего.
ответить
☞ From Anonymous (unverified) Sun May 26 10:09:00 2013 UTC
Не компилируется
"Исходный текст примера MultiMatrix из последней главы" не компилируется
multimatrix.cpp: In member function ‘T& MultiMatrix::operator[](unsigned int) [with T = int, T init_val = -0x00000000000000001]’:
multimatrix.cpp:67:21: instantiated from here
multimatrix.cpp:60:28: error: ‘class Array’ has no member named ‘Elem’
ответить
From admin Mon May 27 05:46:53 2013 UTC
Спасибо!
Там действительно какая-то странная версия оказалась, частично исправленная, частично нет. Я выложил исправленный вариант, можете попробовать.
ответить
From James (unverified) Thu Jun 21 13:02:00 2018 UTC
Кстати
Кстати, в четвёртом издании книги эта ошибочка на месте
ответить
From admin Thu Jun 21 14:11:51 2018 UTC
Good catch
Исходники примера поправил, а исходник рукописи книжки — забыл, естественно.
Нынче в работе четвёртый том "введения в профессию", там я это дело пометил жирным "к доработке", так что в этот раз злая бага не проскочит. Спасибо.
ответить
☞ From Anonymous (unverified) Wed May 22 19:07:00 2013 UTC
Const
Здравствуйте!
На стр.57 возможно за место MyInt operator++(int) {/*...*/} стоит написать const MyInt operator++(int) {/*...*/}, чтобы, например, не было такого:
MyInt test(4);
test++ = 16;
За книжку большое спасибо!
ответить
From admin Wed May 22 20:34:32 2013 UTC
век живи, как говорится
Вот ей-богу, до сего момента я был уверен, что значение (если оно не ссылка) леводопустимым не будет и так. Заметим, если функция возвращает обычный int, то присваивание применить не получится. Стало быть, для классов сие правило не работает.
Кошмарная штука этот C++, если подумать.
ответить
From Anonymous (unverified) Wed May 22 20:42:00 2013 UTC
Точно
Про встроенный тип это да). Но ведь компилятор создает временный объект, при возврате из функции (метода), и получается, что с этим объектом можно работать как и с любым другим. Ужас)))
ответить
From admin Thu May 23 10:33:28 2013 UTC
временный объект, ага
Вот то-то и оно, ведь временные и анонимные объекты даже нельзя передавать по неконстантной ссылке (вне всякой зависимости от их собственной константности), именно из тех соображений, что они по смыслу не должны быть леводопустимыми.
Судя по тому, что мы тут видим, this — не ссылка, а указатель, и по нему временные объекты передавать, видимо, можно. Я фигею от этой семантики.
ответить
From Anonymous (unverified) Mon May 27 18:51:00 2013 UTC
this
Здравствуйте!
Не совсем понял о чем здесь речь.
Судя по тому, что мы тут видим, this — не ссылка, а указатель, и по нему временные объекты передавать, видимо, можно
Можно поподробнее? Просто мы говорили об этом:
MyInt operator++(int) {MyInt tmp(*this); i++; return tmp;}
По указателю ничего не передается. Или я что-то не так понял?
ответить
From admin Tue May 28 12:05:25 2013 UTC
Да уж, не поняли
Начать с того, что тело операции ++ никак не может оказать влияние на то, как её можно, а как нельзя вызывать. Тело и вызов вообще могут быть в разных единицах трансляции.
А по указателю передаётся объект при вызове операции ++. И речь здесь о том, что, оказывается, временный/анонимный объект можно передавать в его методы по неконстантному this, что, мягко говоря, неожиданно, особенно с учётом того, что передавать временные/анонимные объекты по неконстантным ссылкам нельзя, и это объясняется так, что неконстантная ссылка по смыслу — выходной параметр, а временные и анонимные объекты по смыслу — не леводопустимые (то есть как бы константы, хотя и не const).
ответить
☞ From dpol (unverified) Wed Apr 10 11:01:00 2013 UTC
очепятка?
стр. 82, char* FileException::strdup:
char *res = new[strlen(str)+1];
-> char *res = new char[strlen(str)+1];
не ?.. на первый вариант gcc (4.7.2) ругается: expected type-specifier before «[»
ответить
From admin Fri Apr 12 18:42:55 2013 UTC
Спасибо!
Совершенно верно, это опечатка (что характерно, как я сейчас посмотрел, она есть во всех трёх версиях книги, живучая попалась). Спасибо за её выявление, теперь есть шанс, что в следующем издании её не будет.
ответить
☞ From Anonymous (unverified) Tue Mar 26 07:47:00 2013 UTC
Файлы к книге
А где же скачать обещаные тексты примеров программ, приведённых в книге?
ответить
From admin Wed Mar 27 18:07:00 2013 UTC
Ой
И вправду нету. Надо сказать, за три года вы первый, кто это заметил :)
Я постараюсь эту ситуацию исправить в ближайшее время; вас что-то конкретное интересует? Если скажете, с чего начать, с того я и начну.
UPD: Основные примеры выложены, если интересует что-то ещё — пишите.
ответить
☞ From Alex (unverified) Mon Feb 4 09:46:00 2013 UTC
Хорошая книга
Хорошая книга для первого раза, но все таки от едких коменнтариев по поводу СТЛ можно было бы воздержаться. Еще можно было бы добавить в соответсвующие места ссылки на "первоисточники" Cатера, Мейерса... (например почему не надо перегражет приведение по типу и т.д.) И ессно уже С++11 на дворе, хотя я подозреваю, что автор скажет несколько нелестных слов о новомо стандарте.
ответить
From admin Thu Feb 14 22:28:00 2013 UTC
Ага, щас
Ну вы там свою книжку тогда напишите
с блэкджеком и шлюхамии в ней воздерживайтесь от чего хотите, а мне не надо рассказывать про достоинства STL, моё мнение по поводу этого бастарда окончательно и пересмотру не подлежит — как, впрочем, и относительно людей, которые не понимают, почему STL именно бастард, а не что-то иное. Я, кстати, не понял, какой "первый раз" имеется в виду, книжка-то, между делом, выдержала три издания, и у меня она не первая и не единственная.Под первоисточниками лично я привык понимать ровно те материалы, которые использованы при подготовке текста, и никакие иные. В данном случае Мейерс и кого вы там ещё упоминаете — в число "первоисточников" не входят, я вообще не считаю нужным тратить время на чтение "современных" книжек по C++ (последняя книжка, прочтение которой не было пустой тратой времени — это "дизайн и эволюция", но, естественно, старого издания, ещё до начала STL-ной эпохи), а "почему не надо использовать операцию преобразования типа" — вынесено из личного опыта.
По поводу очередного поделья "стандартизаторов" я тоже уже высказывался, повторяться смысла не вижу.
ответить
From Alex (unverified) Mon Apr 22 00:43:00 2013 UTC
первый раз
Андрей, для первого раза, я имел ввиду для начинающих. А по поводу stl и с++11 с вами многие не согласятся. Я только соглашусь, что из-за всех нововведений и без того сложный язык,
стел еще сложнее для эффективного использования.
В чисто вычислительных задачах на кластерах до сих пор используется фортран, с++ претендует на нечто большее, и дает много новых возможностей, которые не обязательно использовать.
Например, если мне нужен hash map, у меня нет желания подключать стороние библитотеки или писать его самому пока это не будет критическим. Или как написать операторы сложения матриц без копирования временных обьектов (a+b+c) без rvalues& или expression templates? Конечно, из-за нагромождения всяких бесполезных структур данных с++ программа может начать работать медленее чем на скала (так случилось на моем лаптопе с кодом из http://research.google.com/pubs/pub37122.html). Но это уже квалификация разработчиков - не надо микроскопом забивать гвозди. В целом, спасибо за книгу.
ответить
From admin Sun May 12 17:48:00 2013 UTC
Конечно, не согласятся
Андрей, для первого раза, я имел ввиду для начинающих.
Принято.
А по поводу stl и с++11 с вами многие не согласятся.
Многие? Я больше скажу: со мной не согласятся практически все, кто C++ увидел после 1999 года (или 1995, если речь идёт об англоязычных программистах), и многие из тех, кто C++ увидел раньше. При этом всех этих "несогласных" можно поделить ровно на две части: (1) те, кто пишут на C++ (с использованием STL и прочих примочек) и (2) те, кто на C++ больше не пишут, потому что "это просто мрак какой-то".
При этом если мы разделим программистов, знающих (но не обязательно использующих) C++, по другому признаку, а именно — на людей, разборчивых в выборе средств, и на тех, кто плевать хотел на грамотный выбор инструмента, лишь бы быстро сляпать, чтобы как-то работало — то получим ровно те же самые две категории людей. Те, кто в выборе средств не разборчив, используют C++ в связке с STL. Те, кто разборчив, в большинстве своём просто уходят из C++ на другие языки, кто-то "вверх", на питон, например, или на Java, кто-то "вниз", на plain C, причём часто даже ANSI C. Замечу, мне часто приходится видеть ООП на чистом С в исполнении таких людей, они моделируют наследование, вручную строят таблицы виртуальных функций и т.п., но о возврате к C++ при этом даже не помышляют, ибо весь этот кошмар с STL'ем, RTTI и прочими примочками — ну, кошмар и есть кошмар.
Остаётся ещё очень малочисленная группа людей, разборчивых в средствах, но при этом понимающих, что C++ сам по себе — инструмент неплохой, если не считать STL и всякие Boost'ы имманентной принадлежностью "C++-программирования" и если быть готовым, например, к --disable-rtty и отказу от исключений. К этой последней группе принадлежу, собственно, я, и я очень надеюсь, что эта группа пополняется за счёт моих учеников и читателей моей книжки.
Например, если мне нужен hash map, у меня нет желания подключать стороние библитотеки или писать его самому пока это не будет критическим.
Ну так пишите на Java или на Питоне, кто мешает? Зачем вам C++, если вы готовы одним махом (подключением STL) угробить все его достоинства?
. Или как написать операторы сложения матриц без копирования временных обьектов (a+b+c) без rvalues&
Как-как, известно как — сделать отдельно объект реализации этой матрицы со счётчиком ссылок и copy-on-write.
Конечно, из-за нагромождения всяких бесполезных структур данных с++ программа может начать работать медленее чем на скала [...] Но это уже квалификация разработчиков
Вы одну простую вещь поймите — это не разработчики виноваты, это вот так вот на мышление программиста действует этот монструозный конгломерат. То есть если быть неразборчивым в средствах, то в результате такая вот "низкая эффективность" будет лишь одним из неизбежных негативных последствий. Ну а человек, разборчивый в средствах, STL применять не станет.
не надо микроскопом забивать гвозди.
Забивание гвоздя микроскопом начинается в тот момент, когда использовано ЛЮБОЕ имя из namespace std. Коготок увяз — всей птичке пропасть.
В целом, спасибо за книгу.
Пожалуйста, мне не жалко. А вам она зачем, если не секрет? Вы на перворазника вроде не похожи.
ответить
☞ From Anonymous (unverified) Fri Feb 1 09:03:00 2013 UTC
Спасибо за
Спасибо за книгу, очень хорошо "прочистила" мозг - до этого многими частями языка пользовался как обезьяна - не особо понимая их смысл и цель существования. Этим Ваша книга и ценна, что много разъясняет.
ответить
From admin Sat Feb 2 10:20:18 2013 UTC
Пожалуйста-пожалуйста,
заходите ещё :)
Если не секрет, а о каких именно возможностях языка идёт речь? Вопрос не праздный, мне интересно, какие потребности возникают у тех, до кого я что-то пытаюсь донести.
ответить
☞ From Anonymous (unverified) Wed Sep 19 13:03:00 2012 UTC
http://habrahabr.ru/post/1517
http://habrahabr.ru/post/151760/
Доступен предзаказ 4-го издания «The C++ Programming Language» by Bjarne Stroustrup
Интересно будит ли так же отличатся спецы обученные до 4-го издание и после него? (как вы заметили своей книги для 3-го).
Не думаю что в нём автор решил разделять С++ и STL, скорее даже наоборот, ввиду появившихся новых контейнеров.
ответить
From admin Wed Sep 19 19:01:43 2012 UTC
Логичный следующий шаг, да
Не думаю, что будут кардинальные отличия. Всё, что Страуструп сделал до третьего издания, внушает уважение, всё, что позже — вызывает недоумение.
Пора новый язык изобретать.
ответить
From Anonymous (unverified) Tue Sep 28 09:05:00 2021 UTC
До третьего
До третьего издания включительно? В сети бродит «Специальное издание третьего»
Rust изобрели! Новый, но об его пользе есть сомнения и даже опасения.
ответить
From admin Tue Sep 28 12:23:00 2021 UTC
Нет,
Нет, разумеется, не включительно. Третье уже начинается с STL без объяснений, что это и как сделано, то есть эта книга нацелена на создание безмозглой обезьяны, а не программиста. Special Edition вышло на несколько лет позже, но это уже неважно — начиная с выхода третьего издания, Страуструпа всерьёз воспринимать нельзя.
Ну а Rust — это даже хуже. Это не просто язык для программирования без применения мозга, этот язык делает вид, что способен выловить за программиста все его ошибки, то есть провоцирует "программиста" отбросить остатки аккуратности и внимательности.
Ну а нормальных языков, увы, сейчас просто нет.
Вы, кстати, обратили внимание, что отвечаете на коммент девятилетней давности?
ответить
From Anonymous (unverified) Wed Sep 29 05:54:00 2021 UTC
Да, на дату
Да, на дату обратил внимание. Уж очень хотелось уточнения, касаемо второго и третьего (спец.) изданий книг Страуструпа и модного/молодёжного Rust. Не создавать же отдельный вопрос. :-)
Спасибо за отзывчивость и ясный ответ.
ответить