C ++ - C++

C ++
ISO C ++ Logo.svg
Логотип C ++, одобренный Standard C ++
ПарадигмыМультипарадигма: процедурный, функциональный, объектно-ориентированный, общий, модульный
СемьяC
РазработаноБьярне Страуструп
РазработчикISO / IEC JTC1 (Объединенный технический комитет 1) / SC22 (Подкомитет 22) / WG21 (Рабочая группа 21)
Впервые появился1985; 35 лет назад (1985)
Стабильный выпуск
C ++ 17 (ИСО / МЭК 14882: 2017) / 1 декабря 2017; 3 года назад (2017-12-01)
Предварительный выпуск
C ++ 20
Печатная дисциплинаСтатический, именительный падеж, частично предполагаемый
Операционные системыСамый крупный
Расширения имени файла.C, .cc, .cpp, .cxx, .c ++, .h, .hh, .hpp, .hxx, .h ++
Интернет сайтisocpp.org
Главный реализации
GCC, LLVM Clang, Microsoft Visual C ++, Embarcadero C ++ Builder, Компилятор Intel C ++, IBM XL C ++, EDG
Под влиянием
Ада,[1] АЛГОЛ 68, C, CLU,[1] ML, Меса,[1] Модула-2,[1] Симула, Болтовня[1]
Под влиянием
Ада 95, C #,[2] C99, Часовня,[3] Clojure,[4] D, Ява,[5] JS ++,[6] Lua, Ним,[7] Perl, PHP, Python,[8] Ржавчина, Семя7

C ++ (/ˌsяˌплʌsˈплʌs/) это язык программирования общего назначения изобретен Бьярне Страуструп как продолжение Язык программирования C, или "C с Классы ". Язык значительно расширился со временем, и современный C ++ теперь имеет объектно-ориентированный, общий, и функциональный функции в дополнение к средствам для низкий уровень объем памяти манипуляции. Он почти всегда реализуется как компилируемый язык, и многие поставщики предоставляют Компиляторы C ++, в том числе Фонд свободного программного обеспечения, LLVM, Microsoft, Intel, Oracle, и IBM, поэтому он доступен на многих платформах.[9]

C ++ был разработан с предвзятостью системное программирование и встроенный, программное обеспечение с ограниченными ресурсами и большие системы, с спектакль, эффективность и гибкость использования - вот основные черты его дизайна.[10] C ++ также оказался полезным во многих других контекстах, ключевыми сильными сторонами которого являются программная инфраструктура и приложения с ограниченными ресурсами,[10] в том числе настольные приложения, видеоигры, серверы (например. электронная коммерция, веб-поиск, или SQL серверов) и приложений, критичных к производительности (например, телефонные переключатели или космические зонды ).[11]

C ++ стандартизирован Международная организация по стандартизации (ISO), последняя версия стандарта ратифицирована и опубликована ISO в декабре 2017 г. ISO / IEC 14882: 2017 (неофициально известный как C ++ 17 ).[12] Язык программирования C ++ был первоначально стандартизирован в 1998 году как ИСО / МЭК 14882: 1998, который затем был изменен С ++ 03, C ++ 11 и C ++ 14 стандарты. Электрический ток C ++ 17 Стандарт заменяет их новыми функциями и увеличенным стандартная библиотека. До первоначальной стандартизации в 1998 году датский ученый-компьютерщик разработал C ++. Бьярне Страуструп в Bell Labs с 1979 года как продолжение Язык C; ему нужен был эффективный и гибкий язык, подобный C, который также обеспечивал функции высокого уровня для программной организации.[13] С 2012 года C ++ находится на трехлетнем графике выпуска,[14] с участием C ++ 20 следующий плановый стандарт (а затем C ++ 23 ).[15]

История

Бьярн Страуструп, создатель C ++, в своем офисе AT&T в Нью-Джерси c. 2000 г.

В 1979 г. Бьярне Страуструп, датский специалист в области информатики, начали работу над "C с Классы", предшественник C ++.[16] Мотивация к созданию нового языка возникла из опыта Страуструпа в программировании для его кандидатской диссертации. Страуструп обнаружил, что Симула имел функции, которые были очень полезны для разработки большого программного обеспечения, но язык был слишком медленным для практического использования, в то время как BCPL был быстрым, но слишком низкоуровневым, чтобы подходить для крупномасштабной разработки программного обеспечения. Когда Страуструп начал работать в AT&T Bell Labs, у него была проблема с анализом UNIX ядро относительно распределенных вычислений. Вспоминая его докторскую степень. опыта, Страуструп намеревался улучшить C язык с Симула -подобные особенности.[17] C был выбран потому, что он был универсальным, быстрым, портативным и широко используемым. Помимо C и Simula, на этот новый язык повлияли и другие языки, включая АЛГОЛ 68, Ада, CLU и ML.

Первоначально "C с классами" Страуструпа добавлял возможности компилятору C, Cpre, включая классы, производные классы, строгая типизация, встраивание и аргументы по умолчанию.[18]

В 1982 году Страуструп начал разработку преемника C с классами, которые он назвал «C ++» (++ будучи оператор приращения в C) после прохождения нескольких других имен. Были добавлены новые функции, в том числе виртуальные функции, имя функции и перегрузка оператора, использованная литература, константы, безопасное для типов выделение памяти со свободным хранением (создание / удаление), улучшенная проверка типов и однострочные комментарии в стиле BCPL с двумя косыми чертами (//). Кроме того, Страуструп разработал новый автономный компилятор для C ++, Cfront.

В 1984 году Страуструп реализовал первую библиотеку потокового ввода / вывода. Идея предоставления оператора вывода, а не именованной функции вывода была предложена Дуг Макилрой[1] (кто ранее предлагал Unix каналы ).

В 1985 г. вышло первое издание Язык программирования C ++ был выпущен, который стал окончательным справочником для языка, поскольку еще не было официального стандарта.[19] Первая коммерческая реализация C ++ была выпущена в октябре того же года.[16]

В 1989 году был выпущен C ++ 2.0, за которым последовало обновленное второе издание Язык программирования C ++ в 1991 г.[20] Новые функции 2.0 включают множественное наследование, абстрактные классы, статические функции-члены, функции-члены const, и защищенные члены. В 1990 г. Аннотированное справочное руководство по C ++ был опубликован. Эта работа стала основой будущего стандарта. Включены более поздние добавления функций шаблоны, исключения, пространства имен, новый бросает, а Логический тип.

Викторина по функциям C ++ 11, проводимая в Париже в 2015 году

В 1998 году был выпущен C ++ 98, стандартизовавший язык и небольшое обновление (С ++ 03 ) был выпущен в 2003 году.

После C ++ 98 C ++ развивался относительно медленно, пока в 2011 г. C ++ 11 standard был выпущен, добавив множество новых функций, расширив стандартную библиотеку и предоставив больше возможностей программистам на C ++. После несовершеннолетнего C ++ 14 обновление выпущено в декабре 2014 г., различные новые дополнения были введены в C ++ 17.[21] Техническая доработка стандарта C ++ 20 состоялась в феврале 2020 года.[22] и проект утвержден 4 сентября 2020 г .; Ожидается, что он будет опубликован к концу 2020 года.[23][24]

По состоянию на 2019 год C ++ сейчас четвертый по популярности язык программирования после Ява, C и Python.[25][26]

3 января 2018 г. Страуструп был объявлен победителем конкурса 2018 г. Приз Чарльза Старка Дрейпера for Engineering, «для концептуализации и разработки языка программирования C ++».[27]

Этимология

Согласно Страуструпу, «название означает эволюционный характер изменений от C».[28] Это имя приписывают Рику Маскитти (середина 1983 г.).[18] и впервые был использован в декабре 1983 года. Когда в 1992 году Маскитти был задан неофициальный вопрос о наименовании, он указал, что оно было дано в насмешливый дух. Название происходит от C ++ оператор (который приращения то ценность из переменная ) и общий соглашение об именовании использования "+" для обозначения расширенной компьютерной программы.

В период разработки C ++ этот язык назывался «новый C» и «C с классами».[18][29] до получения своего окончательного названия.

Философия

На протяжении всей жизни C ++ его развитие и эволюция руководствовались рядом принципов:[17]

  • Он должен быть вызван реальными проблемами, и его функции должны быть незамедлительно полезны в реальных программах.
  • Каждая функция должна быть реализуемой (с достаточно очевидным способом сделать это).
  • Программисты должны иметь право выбирать свой собственный стиль программирования, и этот стиль должен полностью поддерживаться C ++.
  • Разрешение полезной функции более важно, чем предотвращение всех возможных злоупотреблений C ++.
  • Он должен обеспечивать возможности для организации программ в отдельные, четко определенные части и предоставлять возможности для объединения отдельно разработанных частей.
  • Никаких неявных нарушений система типов (но допускать явные нарушения, то есть явно запрошенные программистом).
  • Типы, созданные пользователями, должны иметь такую ​​же поддержку и производительность, как и встроенные типы.
  • Неиспользуемые функции не должны отрицательно влиять на созданные исполняемые файлы (например, снижать производительность).
  • Под C ++ не должно быть языка (кроме язык ассемблера ).
  • C ++ должен работать вместе с другими существующими языки программирования вместо того, чтобы создавать собственные отдельные и несовместимые среда программирования.
  • Если намерение программиста неизвестно, разрешите программисту указать его, предоставив ручное управление.

Стандартизация

Сцена во время заседания комитета по стандартам C ++ в Стокгольме в 1996 г.
Стандарты C ++
ГодСтандарт C ++Неофициальное имя
1998ИСО / МЭК 14882: 1998[30]C ++ 98
2003ИСО / МЭК 14882: 2003[31]С ++ 03
2011ИСО / МЭК 14882: 2011[32]C ++ 11, C ++ 0x
2014ИСО / МЭК 14882: 2014[33]C ++ 14, C ++ 1y
2017ISO / IEC 14882: 2017[12]C ++ 17, C ++ 1z
2020быть определеннымC ++ 20,[21] C ++ 2a

C ++ стандартизирован ISO рабочая группа, известная как JTC1 / SC22 / WG21. На данный момент он опубликовал пять версий стандарта C ++ и в настоящее время работает над следующей версией, C ++ 20.

В 1998 году рабочая группа ISO впервые стандартизировала C ++ как ИСО / МЭК 14882: 1998, который неофициально известен как C ++ 98. В 2003 году была опубликована новая версия стандарта C ++ под названием ИСО / МЭК 14882: 2003, в котором исправлены проблемы, выявленные в C ++ 98.

Следующая крупная версия стандарта неофициально называлась «C ++ 0x», но была выпущена только в 2011 году.[34] C ++ 11 (14882: 2011) включает множество дополнений как к основному языку, так и к стандартной библиотеке.[32]

В 2014, C ++ 14 (также известный как C ++ 1y) был выпущен как небольшое расширение для C ++ 11, содержащий в основном исправления ошибок и небольшие улучшения.[35] Процедура голосования по проекту международного стандарта завершилась в середине августа 2014 года.[36]

После C ++ 14 произошла серьезная переработка C ++ 17, неофициально известный как C ++ 1z, был завершен комитетом ISO по C ++ в середине июля 2017 года и был одобрен и опубликован в декабре 2017 года.[37]

В рамках процесса стандартизации ISO также публикует технические отчеты и спецификации:

  • ISO / IEC TR 18015: 2006[38] об использовании C ++ во встроенных системах и о влиянии на производительность функций языка и библиотеки C ++,
  • ISO / IEC TR 19768: 2007[39] (также известный как Технический отчет C ++ 1 ) на расширениях библиотеки, в основном интегрированных в C ++ 11,
  • ISO / IEC TR 29124: 2010[40] по специальным математическим функциям,
  • ISO / IEC TR 24733: 2011[41] на десятичная с плавающей запятой арифметика,
  • ISO / IEC TS 18822: 2015[42] в стандартной библиотеке файловой системы,
  • ISO / IEC TS 19570: 2015[43] на параллельно версии алгоритмов стандартной библиотеки,
  • ISO / IEC TS 19841: 2015[44] по программному обеспечению транзакционная память,
  • ISO / IEC TS 19568: 2015[45] на новом наборе расширений библиотеки, некоторые из которых уже интегрированы в C ++ 17,
  • ISO / IEC TS 19217: 2015[46] на C ++ концепции, интегрированный в C ++ 20
  • ISO / IEC TS 19571: 2016[47] о расширениях библиотеки для параллелизма
  • ISO / IEC TS 19568: 2017[48] на новом наборе расширений библиотеки общего назначения
  • ISO / IEC TS 21425: 2017[49] о расширениях библиотеки для диапазонов, интегрированных в C ++ 20
  • ISO / IEC TS 22277: 2017[50] на сопрограммах
  • ISO / IEC TS 19216: 2018[51] в сетевой библиотеке
  • ISO / IEC TS 21544: 2018[52] по модулям
  • ISO / IEC TS 19570: 2018[53] о новом наборе расширений библиотеки для параллелизма

Другие технические характеристики, включая статическое отражение, находятся в разработке и ожидают утверждения.[54]

Язык

В языке C ++ есть два основных компонента: прямое сопоставление аппаратных функций, предоставляемых в основном подмножеством C, и абстракции с нулевыми накладными расходами, основанные на этих сопоставлениях. Страуструп описывает C ++ как «легкий язык программирования с абстракциями [разработанный] для создания и использования эффективных и элегантных абстракций»;[10] и «предложение аппаратного доступа и абстракции - основа C ++. Эффективное выполнение - вот что отличает его от других языков».[55]

C ++ наследует большую часть Синтаксис C. Ниже приводится версия Бьярна Страуструпа. Привет, мир программа который использует Стандартная библиотека C ++ средство потока для записи сообщения стандартный вывод:[56][57]

1 #включают <iostream>2 3 int основной()4 {5     стандартное::cout << "Привет мир! п";6 }

Хранилище объектов

Как и в C, C ++ поддерживает четыре типа управление памятью: объекты продолжительности статического хранения, объекты продолжительности хранения потока, объекты продолжительности автоматического хранения и объекты продолжительности динамического хранения.[58]

Объекты длительности статического хранения

Объекты длительности статического хранения создаются до основной() вводится (см. исключения ниже) и уничтожается в обратном порядке создания после основной() выходы. Точный порядок создания не указан в стандарте (хотя есть некоторые правила, определенные ниже), чтобы дать реализациям некоторую свободу в том, как организовать их реализацию. Более формально, объекты этого типа имеют продолжительность жизни, которая «должна длиться в течение всей программы».[59]

Объекты длительности статического хранения инициализируются в два этапа. Сначала выполняется «статическая инициализация», и только после вся статическая инициализация выполняется, выполняется «динамическая инициализация». При статической инициализации все объекты сначала инициализируются нулями; после этого все объекты, которые имеют постоянную фазу инициализации, инициализируются постоянным выражением (т.е. переменные инициализируются литералом или constexpr). Хотя это не указано в стандарте, фаза статической инициализации может быть завершена во время компиляции и сохранена в разделе данных исполняемого файла. Динамическая инициализация включает в себя всю инициализацию объекта, выполняемую с помощью конструктора или вызова функции (если функция не отмечена значком constexpr, в C ++ 11). Порядок динамической инициализации определяется как порядок объявления в модуле компиляции (то есть в том же файле). Не дается никаких гарантий относительно порядка инициализации между модулями компиляции.

Объекты продолжительности хранения потока

Переменные этого типа очень похожи на статические объекты продолжительности хранения. Основное отличие заключается в том, что время создания - непосредственно перед созданием потока, а уничтожение выполняется после присоединения потока.[60]

Объекты автоматической продолжительности хранения

Наиболее распространенные типы переменных в C ++ - это локальные переменные внутри функции или блока и временные переменные.[61] Общей чертой автоматических переменных является то, что у них есть время жизни, ограниченное областью действия переменной. Они создаются и потенциально инициализируются в момент объявления (подробнее см. Ниже) и уничтожаются в обеспечить регресс порядок создания при выходе из области видимости. Это реализуется путем выделения на стек.

Локальные переменные создаются, когда точка выполнения проходит точку объявления. Если переменная имеет конструктор или инициализатор, он используется для определения начального состояния объекта. Локальные переменные уничтожаются, когда закрывается локальный блок или функция, в которой они объявлены. Деструкторы C ++ для локальных переменных вызываются в конце жизненного цикла объекта, что обеспечивает дисциплину автоматического управления ресурсами, называемую RAII, который широко используется в C ++.

Переменные-члены создаются при создании родительского объекта. Члены массива инициализируются от 0 до последнего члена массива по порядку. Переменные-члены уничтожаются, когда родительский объект уничтожается в порядке, обратном созданию. т.е. если родительский объект является «автоматическим объектом», то он будет уничтожен, когда он выйдет за пределы области видимости, что вызовет уничтожение всех его членов.

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

Объекты продолжительности динамического хранения

Эти объекты имеют динамический срок жизни и могут быть созданы напрямую с помощью вызова новый и уничтожается явно с помощью вызова Удалить.[62] C ++ также поддерживает маллок и свободный, из C, но они несовместимы с новый и Удалить. Использование новый возвращает адрес в выделенную память. Основные принципы C ++ не рекомендуют использовать новый непосредственно для создания динамических объектов в пользу интеллектуальных указателей через make_unique<Т> для единоличного владения и make_shared<Т> для многократного владения с подсчетом ссылок,[63] которые были введены в C ++ 11.

Шаблоны

Шаблоны C ++ включить общее программирование. C ++ поддерживает шаблоны функций, классов, псевдонимов и переменных. Шаблоны могут быть параметризованы типами, константами времени компиляции и другими шаблонами. Шаблоны реализованы реализация во время компиляции. Чтобы создать экземпляр шаблона, компиляторы заменяют определенные аргументы параметрами шаблона, чтобы сгенерировать конкретную функцию или экземпляр класса. Некоторые замены невозможны; они устраняются политикой разрешения перегрузки, описанной фразой "Ошибка замены не является ошибкой "(SFINAE). Шаблоны - мощный инструмент, который можно использовать для общее программирование, метапрограммирование шаблона, и оптимизация кода, но эта сила требует затрат. Использование шаблона может увеличить размер кода, потому что каждый экземпляр шаблона создает копию кода шаблона: по одной для каждого набора аргументов шаблона, однако это такой же или меньший объем кода, который был бы сгенерирован, если бы код был написан вручную.[64] Это контрастирует с дженериками времени выполнения, представленными на других языках (например, Ява ), где во время компиляции тип стирается, а одно тело шаблона сохраняется.

Шаблоны отличаются от макросы: хотя обе эти функции языка времени компиляции позволяют условную компиляцию, шаблоны не ограничиваются лексической заменой. Шаблоны осведомлены о семантике и системе типов своего сопутствующего языка, а также обо всех определениях типов во время компиляции и могут выполнять высокоуровневые операции, включая программное управление потоком, основанное на оценке параметров со строгой проверкой типа. Макросы способны к условному управлению компиляцией на основе заранее определенных критериев, но не могут создавать экземпляры новых типов, рекурсивно или выполнять оценку типа и, по сути, ограничены заменой текста перед компиляцией и включением / исключением текста. Другими словами, макросы могут управлять потоком компиляции на основе заранее определенных символов, но не могут, в отличие от шаблонов, независимо создавать новые символы. Шаблоны - это инструмент для статических полиморфизм (см. ниже) и общее программирование.

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

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

Объекты

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

Инкапсуляция

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

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

Обычно считается хорошей практикой делать все данные частные или защищенные, и сделать общедоступными только те функции, которые являются частью минимального интерфейса для пользователей класса. Это может скрыть детали реализации данных, позволяя разработчику позже коренным образом изменить реализацию, никоим образом не изменяя интерфейс.[65][66]

Наследование

Наследование позволяет одному типу данных приобретать свойства других типов данных. Наследование от базовый класс могут быть объявлены общедоступными, защищенными или частными. Этот спецификатор доступа определяет, могут ли несвязанные и производные классы получить доступ к унаследованным общедоступным и защищенным членам базового класса. Только публичное наследование соответствует тому, что обычно подразумевается под «наследованием». Две другие формы используются гораздо реже. Если спецификатор доступа опущен, «класс» наследуется частным образом, а «структура» - публично. Базовые классы могут быть объявлены виртуальными; это называется виртуальное наследование. Виртуальное наследование гарантирует, что в графе наследования существует только один экземпляр базового класса, что позволяет избежать некоторых проблем неоднозначности множественного наследования.

Множественное наследование это функция C ++, отсутствующая в большинстве других языков, позволяющая классу быть производным от более чем одного базового класса; это позволяет создавать более сложные отношения наследования. Например, класс «Летающий кот» может наследовать как от «Кошка», так и от «Летающего млекопитающего». Некоторые другие языки, например C # или Ява, выполнить нечто подобное (хотя и более ограниченное), разрешив наследование нескольких интерфейсы при ограничении количества базовых классов одним (интерфейсы, в отличие от классов, предоставляют только объявления функций-членов, без реализации или данных-членов). Интерфейс, как в C # и Java, может быть определен в C ++ как класс, содержащий только чистые виртуальные функции, часто известные как абстрактный базовый класс или "ABC". Функции-члены такого абстрактного базового класса обычно явно определяются в производном классе, а не наследуются неявно. Виртуальное наследование C ++ демонстрирует функцию разрешения неоднозначности, называемую господство.

Операторы и перегрузка операторов

Операторы, которые нельзя перегружать
ОператорСимвол
Оператор разрешения области видимости::
Условный оператор?:
оператор точки.
Оператор выбора члена.*
"размер операторразмер
"типичный оператортипичный

C ++ предоставляет более 35 операторов, охватывающих базовую арифметику, манипуляции с битами, косвенное обращение, сравнения, логические операции и другие. Практически все операторы могут быть перегружен для определяемых пользователем типов, с некоторыми заметными исключениями, такими как доступ к члену (. и .*), а также условный оператор. Богатый набор перегружаемых операторов играет центральную роль в том, чтобы пользовательские типы в C ++ выглядели как встроенные.

Перегружаемые операторы также являются неотъемлемой частью многих передовых методов программирования на C ++, таких как умные указатели. Перегрузка оператора не меняет приоритета вычислений с участием оператора, а также не меняет количество операндов, которые использует оператор (однако любой операнд может игнорироваться оператором, хотя он будет оценен до выполнения). Перегружен "&&" и "||"операторы теряют оценка короткого замыкания свойство.

Полиморфизм

Полиморфизм позволяет использовать один общий интерфейс для многих реализаций и позволяет объектам действовать по-разному в разных обстоятельствах.

C ++ поддерживает несколько видов статический (решено в время компиляции ) и динамичный (решено в время выполнения ) полиморфизмы, поддерживаемые языковыми функциями, описанными выше. Полиморфизм времени компиляции не позволяет принимать определенные решения во время выполнения, в то время как полиморфизм времени выполнения обычно приводит к снижению производительности.

Статический полиморфизм

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

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

Шаблоны в C ++ предоставляют сложный механизм для написания универсального полиморфного кода (т.е. параметрический полиморфизм ). В частности, через любопытно повторяющийся шаблон шаблона, можно реализовать форму статического полиморфизма, которая точно имитирует синтаксис для переопределения виртуальных функций. Поскольку шаблоны C ++ распознают типы и Полный по Тьюрингу, их также можно использовать, чтобы позволить компилятору разрешать рекурсивные условные выражения и генерировать важные программы с помощью метапрограммирование шаблона. Вопреки некоторому мнению, шаблонный код не будет генерировать массовый код после компиляции с правильными настройками компилятора.[64]

Динамический полиморфизм

Наследование

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

C ++ также предоставляет dynamic_cast оператор, который позволяет коду безопасно попытаться преобразовать объект через базовую ссылку / указатель в более производный тип: понижение. В попытка необходимо, поскольку часто неизвестно, на какой производный тип ссылаются. (Апкастинг, преобразование в более общий тип, всегда можно проверить / выполнить во время компиляции через static_cast, поскольку предковые классы указаны в интерфейсе производного класса, видимого для всех вызывающих.) dynamic_cast полагается на информация о типе времени выполнения (RTTI), метаданные в программе, позволяющие различать типы и их отношения. Если dynamic_cast к указателю не удается, результатом является nullptr константа, тогда как если адресатом является ссылка (которая не может быть нулевой), приведение выдает исключение. Объекты известный чтобы иметь определенный производный тип, можно привести к этому с помощью static_cast, минуя RTTI и безопасную проверку типов во время выполнения dynamic_cast, поэтому это следует использовать только в том случае, если программист очень уверен, что приведение является и всегда будет правильным.

Виртуальные функции-члены

Обычно, когда функция в производном классе отменяет функция в базовом классе, функция для вызова определяется типом объекта. Данная функция переопределяется, если не существует разницы в количестве или типе параметров между двумя или более определениями этой функции. Следовательно, во время компиляции может оказаться невозможным определить тип объекта и, следовательно, правильную функцию для вызова, учитывая только указатель базового класса; поэтому решение откладывается до времени выполнения. Это называется динамическая отправка. Виртуальные функции-члены или методы[67] позволяют вызывать наиболее конкретную реализацию функции в соответствии с фактическим типом времени выполнения объекта. В реализациях C ++ это обычно делается с помощью таблицы виртуальных функций. Если тип объекта известен, это можно обойти, добавив полное имя класса перед вызовом функции, но обычно вызовы виртуальных функций разрешаются во время выполнения.

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

Функцию-член также можно сделать «чистой виртуальной», добавив к ней = 0 после закрывающей скобки и перед точкой с запятой. Класс, содержащий чистую виртуальную функцию, называется абстрактный класс. Объекты нельзя создавать из абстрактного класса; они могут быть получены только из. Любой производный класс наследует виртуальную функцию как чистую и должен обеспечивать ее нечистое определение (и все другие чистые виртуальные функции) до того, как объекты производного класса могут быть созданы. Программа, которая пытается создать объект класса с чистой виртуальной функцией-членом или унаследованной чистой виртуальной функцией-членом, плохо сформирована.

Лямбда-выражения

C ++ обеспечивает поддержку анонимные функции, также известные как лямбда-выражения, в следующей форме:

[захватить](параметры) -> return_type { function_body }

Если лямбда не принимает параметров, () можно опустить, т. Е.

[захватить] -> return_type { function_body }

Кроме того, тип возвращаемого значения лямбда-выражения может быть автоматически выведен, если это возможно, например:

[](int Икс, int у) { вернуть Икс + у; } // предполагаемый[](int Икс, int у) -> int { вернуть Икс + у; } // явный

В [захватить] list поддерживает определение закрытие. Такие лямбда-выражения определены в стандарте как синтаксический сахар для неназванного функциональный объект.

Обработка исключений

Обработка исключений используется для сообщения о существовании проблемы или ошибки времени выполнения, от того места, где она была обнаружена, до того, где проблема может быть обработана.[68] Это позволяет делать это единообразно и отдельно от основного кода, обнаруживая при этом все ошибки.[69] В случае возникновения ошибки генерируется (вызывается) исключение, которое затем перехватывается ближайшим подходящим обработчиком исключений. Исключение вызывает выход из текущей области действия, а также из каждой внешней области (распространения) до тех пор, пока не будет найден подходящий обработчик, вызывая, в свою очередь, деструкторы любых объектов в этих завершенных областях.[70] При этом исключение представлено в виде объекта, несущего данные об обнаруженной проблеме.[71]

Некоторые руководства по стилю C ++, такие как Google,[72] LLVM,[73] и Qt[74] запретить использование исключений.

Код, вызывающий исключение, помещается внутри пытаться блок. Исключения обрабатываются в отдельных ловить блоки (обработчики); каждый пытаться block может иметь несколько обработчиков исключений, как это видно в примере ниже.[75]

 1 #включают <iostream> 2 #включают <vector> 3 #включают <stdexcept> 4  5 int основной() { 6     пытаться { 7         стандартное::вектор<int> vec{3, 4, 3, 1}; 8         int я{vec.в(4)}; // Выдает исключение std :: out_of_range (индексирование для vec от 0 до 3, а не от 1 до 4) 9     }10     // Обработчик исключения, перехватывает std :: out_of_range, который сгенерирован vec.at (4)11     ловить (стандартное::вне зоны доступа &е) {12         стандартное::Cerr << «Доступ к несуществующему элементу:» << е.какая() << ' n';13     }14     // Чтобы перехватить любые другие исключения стандартной библиотеки (они происходят от std :: exception)15     ловить (стандартное::исключение &е) {16         стандартное::Cerr << "Возникло исключение:" << е.какая() << ' n';17     }18     // Поймать любые нераспознанные исключения (т.е. те, которые не являются производными от std :: exception)19     ловить (...) {20         стандартное::Cerr << "Некоторая фатальная ошибка п";21     }22 }

Также можно целенаправленно создавать исключения, используя бросить ключевое слово; эти исключения обрабатываются обычным образом. В некоторых случаях исключения нельзя использовать по техническим причинам. Одним из таких примеров является критический компонент встроенной системы, где каждая операция должна быть гарантированно завершена в течение определенного периода времени. Это не может быть определено с помощью исключений, поскольку не существует инструментов для определения максимального времени, необходимого для обработки исключения.[76]

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

Стандартная библиотека

Проект стандарта «Рабочий документ», утвержденный как C ++ 98; половина его размера была посвящена стандартной библиотеке C ++

C ++ стандарт состоит из двух частей: основного языка и стандартной библиотеки. Программисты на C ++ ожидают последнего от каждой крупной реализации C ++; он включает агрегатные типы (векторов, списки, карты, наборы, очереди, стеки, массивы, кортежи), алгоритмы (найти, для каждого, binary_search, random_shuffle и т. д.), средства ввода / вывода (iostream, для чтения и записи в консоль и файлы), библиотека файловой системы, поддержка локализации, умные указатели для автоматического управления памятью, регулярное выражение поддержка, многопоточность библиотека, поддержка атомики (позволяющая считывать или записывать переменную не более чем одним потоком за раз без какой-либо внешней синхронизации), утилит времени (измерение, получение текущего времени и т. д.), система для преобразования отчетов об ошибках, которые не работают. я использую C ++ исключения в исключения C ++, генератор случайных чисел и немного измененная версия Стандартная библиотека C (чтобы он соответствовал системе типов C ++).

Большая часть библиотеки C ++ основана на Стандартная библиотека шаблонов (STL). Полезные инструменты, предоставляемые STL, включают контейнеры как коллекции объектов (например, векторов и списки ), итераторы которые обеспечивают доступ к контейнерам в виде массивов, и алгоритмы которые выполняют такие операции, как поиск и сортировка.

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

Стандарт включает STL, который изначально был разработан Александр Степанов, который много лет экспериментировал с универсальными алгоритмами и контейнерами. Когда он начал с C ++, он наконец нашел язык, на котором можно было создавать общие алгоритмы (например, сортировку STL), которые работают даже лучше, чем, например, стандартная библиотека C qsort, благодаря таким функциям C ++, как использование встраивания и компиляции. привязка времени вместо указателей функций. Стандарт не называет его «STL», поскольку это просто часть стандартной библиотеки, но этот термин все еще широко используется, чтобы отличить его от остальной части стандартной библиотеки (потоки ввода / вывода, интернационализация, диагностика, подмножество библиотеки C и т. д.).[77]

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

Основные принципы C ++

Основные принципы C ++[78] - это инициатива, возглавляемая Бьярном Страуструпом, изобретателем C ++, и Хербом Саттером, организатором и председателем рабочей группы C ++ ISO, чтобы помочь программистам писать `` современный C ++ '', используя лучшие практики для языковых стандартов C ++ 14 и новее , и помочь разработчикам компиляторов и инструментов статической проверки создавать правила для выявления неправильных методов программирования.

Основная цель - эффективно и последовательно писать на C ++, безопасном для типов и ресурсов.

Были объявлены основные принципы[79] во вступительной речи на CPPCon 2015.

Рекомендации сопровождаются Библиотекой поддержки рекомендаций (GSL),[80] библиотека типов и функций только для заголовков для реализации основных рекомендаций и инструментов статической проверки для обеспечения соблюдения правил рекомендаций.[81]

Совместимость

Чтобы предоставить поставщикам компиляторов большую свободу, комитет по стандартам C ++ решил не диктовать реализацию искажение имени, Обработка исключений, и другие особенности реализации. Обратной стороной этого решения является то, что объектный код производится разными компиляторы ожидается несовместимость. Однако были попытки стандартизировать компиляторы для конкретных машин или операционные системы (например C ++ ABI),[82] хотя сейчас они, кажется, в основном заброшены.

С C

C ++ часто считается надмножеством C но это не совсем так.[83] Большую часть кода C можно легко заставить правильно скомпилировать в C ++, но есть несколько отличий, из-за которых некоторый допустимый код C становится недопустимым или ведет себя иначе в C ++. Например, C позволяет неявное преобразование из пустота* на другие типы указателей, но не в C ++ (по соображениям безопасности типов). Кроме того, C ++ определяет множество новых ключевых слов, например новый и класс, которые могут использоваться в качестве идентификаторов (например, имен переменных) в программе на языке C.

Некоторые несовместимости были устранены в версии стандарта C 1999 г. (C99 ), который теперь поддерживает функции C ++, такие как строковые комментарии (//) и объявления, смешанные с кодом. С другой стороны, C99 представил ряд новых функций, которые C ++ не поддерживал и которые были несовместимы или избыточны в C ++, например массивы переменной длины, собственные типы комплексных чисел (однако стандартное::сложный класс в стандартной библиотеке C ++ обеспечивает аналогичную функциональность, хотя и несовместим с кодом), назначенные инициализаторы, составные литералы, а ограничивать ключевое слово.[84] Некоторые из функций, представленных C99, были включены в следующую версию стандарта C ++, C ++ 11 (из тех, которые не были лишними).[85][86][87] Однако стандарт C ++ 11 вводит новые несовместимости, такие как запрет на присвоение строкового литерала символьному указателю, который остается действительным C.

Чтобы смешивать код C и C ++, любое объявление или определение функции, которое должно вызываться / использоваться как в C, так и в C ++, должно быть объявлено со связью C, поместив его в внешний "C" {/*...*/} блок. Такая функция может не зависеть от функций в зависимости от искажение имени (т.е. перегрузка функции).

Критика

Несмотря на широкое распространение, некоторые известные программисты критиковали язык C ++, в том числе Линус Торвальдс,[88] Ричард Столмен,[89] Джошуа Блох, Кен Томпсон,[90][91][92] и Дональд Кнут.[93][94]

Один из наиболее часто критикуемых моментов C ++ - его воспринимаемая сложность как языка, с критикой, что большое количество неортогональных функций на практике требует ограничения кода подмножеством C ++, тем самым избегая преимуществ читабельности общего стиля и идиом. По выражению Джошуа Блох:

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

Дональд Кнут (1993, комментируя предварительно стандартизованный C ++), который сказал о Эдсгер Дейкстра что «думать о программировании на C ++» «сделало бы его физически больным»:[93][94]

Проблема, с которой я столкнулся сегодня с ними, заключается в том, что ... C ++ слишком сложен. На данный момент для меня невозможно написать переносимый код, который, как я полагаю, работал бы на множестве различных систем, если я не избегаю всех экзотических функций. Всякий раз, когда у разработчиков языка C ++ возникали две конкурирующие идеи относительно того, как им решать какую-либо проблему, они говорили: «Хорошо, мы сделаем их обе». Так что язык на мой вкус слишком барочный.

Кен Томпсон, который был коллегой Страуструпа в Bell Labs, дает свою оценку:[91][92]

В этом, безусловно, есть свои плюсы. Но в целом я считаю, что это плохой язык. Многие вещи он делает наполовину хорошо, и это просто куча взаимоисключающих идей. Все, кого я знаю, будь то личные или корпоративные, выбирают подмножество, и эти подмножества разные. Так что это не лучший язык для передачи алгоритма - сказать: «Я написал его; вот, возьми. Он слишком большой, слишком сложный. И это очевидно построенный комитетом. Страуструп годами, годами и годами проводил кампанию, выходящую за рамки какого-либо технического вклада, который он внес в язык, за его принятие и использование. И он вроде как руководил всеми комитетами по стандартам с помощью кнута и стула. И он никому не сказал «нет». Он вложил все функции на этом языке, которые когда-либо существовали. Это не было чисто разработано - это был просто союз всего, что происходило. И я думаю, что он сильно пострадал от этого.

Однако Брайан Керниган, также коллега из Bell Labs, оспаривает эту оценку:[95]

C ++ оказал огромное влияние. ... Многие люди говорят, что C ++ слишком велик, слишком сложен и т. Д. И т. Д., Но на самом деле это очень мощный язык, и почти все, что там есть, существует по действительно веской причине: это не кто-то случайные изобретения , на самом деле это люди, пытающиеся решить проблемы реального мира. Многие программы, которые мы сегодня принимаем как должное и которые мы просто используем, являются программами на C ++.

Сам Страуструп отмечает, что семантика C ++ намного чище, чем его синтаксис: «внутри C ++ есть гораздо меньший и более чистый язык, изо всех сил пытающийся выбраться».[96]

Другие жалобы могут включать отсутствие отражение или вывоз мусора, долгое время компиляции, воспринимается ползучесть функций,[97] и подробные сообщения об ошибках, особенно из-за метапрограммирования шаблонов.[98]

Смотрите также

использованная литература

  1. ^ а б c d е ж Бьярне Страуструп. «История C ++: 1979–1991». Дои:10.1145/234286.1057836. Цитировать журнал требует | журнал = (Помогите)
  2. ^ Науглер, Дэвид (май 2007 г.). «C # 2.0 для программистов на C ++ и Java: семинар-практикум». Журнал компьютерных наук в колледжах. 22 (5). Хотя на C # сильно повлияла Java, на него также сильно повлиял C ++, и его лучше всего рассматривать как потомка как C ++, так и Java.
  3. ^ "Спецификация часовни (Благодарности)" (PDF). Cray Inc. 1 октября 2015 г.. Получено 14 января 2016.
  4. ^ "Rich Hickey Q&A от Майкла Фогуса". Архивировано из оригинал 11 января 2017 г.. Получено 11 января 2017.
  5. ^ Гарри. Х. Чаудхари (28 июля 2014 г.). "Cracking The Java Programming Interview :: 2000+ Java Interview Que / Ans". Получено 29 мая 2016.
  6. ^ Роджер Пун (1 мая 2017 г.). «Масштабирование JS ++: абстракция, производительность и удобочитаемость». Получено 21 апреля 2020.
  7. ^ "FAQ по языку программирования Nim". Получено 21 апреля 2020.
  8. ^ «9. Классы - документация Python 3.6.4». docs.python.org. Получено 9 января 2018.
  9. ^ Страуструп, Бьярне (1997). "1". Язык программирования C ++ (Третье изд.). ISBN  0-201-88954-4. OCLC  59193992.
  10. ^ а б c Страуструп, Б. (6 мая 2014 г.). «Лекция: Суть C ++. Эдинбургский университет». Получено 12 июн 2015.
  11. ^ Страуструп, Бьярн (17 февраля 2014 г.). «Приложения C ++». stroustrup.com. Получено 5 мая 2014.
  12. ^ а б «ISO / IEC 14882: 2017». Международная организация по стандартизации.
  13. ^ "Домашняя страница Бьярна Страуструпа". www.stroustrup.com.
  14. ^ "График C ++ IS" (PDF).
  15. ^ "C ++; Куда он идет".
  16. ^ а б Страуструп, Бьярн (7 марта 2010 г.). "Часто задаваемые вопросы Бьярна Страуструпа: когда был изобретен C ++?". stroustrup.com. Получено 16 сентября 2010.
  17. ^ а б Страуструп, Бьярн. "Развитие языка в реальном мире: C ++ 1991-2006" (PDF).
  18. ^ а б c Страуструп, Бьярн. «История C ++: 1979–1991» (PDF).
  19. ^ Страуструп, Бьярн. «Язык программирования C ++» (Первое изд.). Получено 16 сентября 2010.
  20. ^ Страуструп, Бьярн. «Язык программирования C ++» (Второе изд.). Получено 16 сентября 2010.
  21. ^ а б https://herbsutter.com/2016/06/30/trip-report-summer-iso-c-standards-meeting-oulu/ «следующим стандартом после C ++ 17 будет C ++ 20»
  22. ^ Душикова, Хана (6 ноября 2019 г.). "N4817: Приглашение на встречу 2020 в Праге и информация" (PDF). Получено 13 февраля 2020.
  23. ^ "Текущее состояние". isocpp.org. Получено 7 сентября 2020.
  24. ^ «Утверждено C ++ 20 - Херб Саттер». isocpp.org. Получено 8 сентября 2020.
  25. ^ "Последние новости." Индекс TIOBE | TIOBE - Компания по качеству программного обеспечения. N.p., n.d. Интернет. 5 июня 2017.
  26. ^ Криль, Пол. «Java, C, C сталкиваются с растущей конкуренцией в популярности». InfoWorld. InfoWorld, 10 февраля 2017 г. Web. 5 июня 2017.
  27. ^ https://www.nae.edu/177355.aspx «Пионер компьютерных наук Бьярн Страуструп получит премию Чарльза Старка Дрейпера 2018 года в области инженерии»
  28. ^ "FAQ Бьярна Страуструпа - Откуда взялось название" C ++ "?". Получено 16 января 2008.
  29. ^ «C для программистов на C ++». Северо-Восточный университет. Архивировано из оригинал 17 ноября 2010 г.. Получено 7 сентября 2015.
  30. ^ «ИСО / МЭК 14882: 1998». Международная организация по стандартизации.
  31. ^ «ISO / IEC 14882: 2003». Международная организация по стандартизации.
  32. ^ а б «ISO / IEC 14882: 2011». Международная организация по стандартизации.
  33. ^ «ISO / IEC 14882: 2014». Международная организация по стандартизации.
  34. ^ «У нас есть международный стандарт: C ++ 0x единогласно одобрен». Sutter's Mill.
  35. ^ «Будущее C ++».
  36. ^ «У нас есть C ++ 14!: Стандартный C ++».
  37. ^ Отчет о поездке: Летнее собрание стандартов ISO C ++ (Торонто)
  38. ^ «ISO / IEC TR 18015: 2006». Международная организация по стандартизации.
  39. ^ «ISO / IEC TR 19768: 2007». Международная организация по стандартизации.
  40. ^ «ISO / IEC TR 29124: 2010». Международная организация по стандартизации.
  41. ^ «ISO / IEC TR 24733: 2011». Международная организация по стандартизации.
  42. ^ «ISO / IEC TS 18822: 2015». Международная организация по стандартизации.
  43. ^ «ISO / IEC TS 19570: 2015». Международная организация по стандартизации.
  44. ^ «ISO / IEC TS 19841: 2015». Международная организация по стандартизации.
  45. ^ «ISO / IEC TS 19568: 2015». Международная организация по стандартизации.
  46. ^ «ISO / IEC TS 19217: 2015». Международная организация по стандартизации.
  47. ^ «ISO / IEC TS 19571: 2016». Международная организация по стандартизации.
  48. ^ «ISO / IEC TS 19568: 2017». Международная организация по стандартизации.
  49. ^ «ISO / IEC TS 21425: 2017». Международная организация по стандартизации.
  50. ^ «ISO / IEC TS 22277: 2017». Международная организация по стандартизации.
  51. ^ «ISO / IEC TS 19216: 2018». Международная организация по стандартизации.
  52. ^ «ISO / IEC TS 21544: 2018». Международная организация по стандартизации.
  53. ^ «ISO / IEC TS 19570: 2018». Международная организация по стандартизации.
  54. ^ См. Список на https://en.cppreference.com/w/cpp/experimental посетил 15 февраля 2019 г.
  55. ^ Б. Страуструп (интервью Серхио де Симоне) (30 апреля 2015 г.). "Страуструп: Мысли о C ++ 17 - Интервью". Получено 8 июля 2015.
  56. ^ Страуструп, Бьярн (2000). Язык программирования C ++ (Специальная ред.). Эддисон-Уэсли. п. 46. ISBN  0-201-70073-5.
  57. ^ Страуструп, Бьярн. «Открытые проблемы для языка программирования C ++ (3-е издание)». Этот код скопирован прямо со страницы исправлений Бьярна Страуструпа (стр. 633). Он обращается к использованию ' n' скорее, чем std :: endl. Также см Могу я написать «void main ()»? для объяснения неявного возврат 0; в основной функция. Этот неявный возврат не доступны в других функциях.
  58. ^ ISO /IEC. Языки программирования - C ++ 11 Draft (n3797) В архиве 2 октября 2018 г. Wayback Machine §3.7 Продолжительность хранения [basic.stc]
  59. ^ ISO /IEC. Языки программирования - C ++ 11 Draft (n3797) В архиве 2 октября 2018 г. Wayback Machine §3.7.1 Длительность статического хранения [basic.stc.static]
  60. ^ ISO /IEC. Языки программирования - C ++ 11 Draft (n3797) В архиве 2 октября 2018 г. Wayback Machine §3.7.2 Продолжительность хранения потока [basic.stc.thread]
  61. ^ ISO /IEC. Языки программирования - C ++ 11 Draft (n3797) В архиве 2 октября 2018 г. Wayback Machine §3.7.3 Продолжительность автоматического хранения [basic.stc.auto]
  62. ^ ISO /IEC. Языки программирования - C ++ 11 Draft (n3797) В архиве 2 октября 2018 г. Wayback Machine §3.7.4 Продолжительность динамического хранения [basic.stc.dynamic]
  63. ^ «Основные принципы C ++». isocpp.github.io. Получено 9 февраля 2020.
  64. ^ а б «Никто не понимает C ++: Часть 5: Раздутие кода шаблона». article.emptycrate.com/: Программное обеспечение EmptyCrate. Путешествовать. Вещи. 6 мая 2008 г.. Получено 8 марта 2010. Иногда вы будете читать или слышать, как кто-то говорит о шаблонах C ++, вызывающих раздувание кода. Я думал об этом на днях и подумал про себя: «Я, если код делает то же самое, то скомпилированный код не может быть больше, не так ли?» [...] А как насчет размера скомпилированного кода? Каждый был скомпилирован с помощью команды g ++ .cpp -O3. Версия без шаблона: 8140 байт, версия шаблона: 8028 байт!
  65. ^ Саттер, Херб; Александреску, Андрей (2004). Стандарты программирования C ++: 101 правила, рекомендации и передовые методы. Эддисон-Уэсли.
  66. ^ Хенриксон, Матс; Найквист, Эрик (1997). Промышленная сила C ++. Прентис Холл. ISBN  0-13-120965-5.
  67. ^ Страуструп, Бьярн (2000). Язык программирования C ++ (Специальная ред.). Эддисон-Уэсли. п. 310. ISBN  0-201-70073-5. Виртуальную функцию-член иногда называют метод.
  68. ^ Майкрофт, Алан (2013). «Исключения C и C ++ | Шаблоны» (PDF). Кембриджская компьютерная лаборатория - материалы курса 2013-14. Получено 30 августа 2016.
  69. ^ Страуструп, Бьярн (2013). Язык программирования C ++. Эддисон Уэсли. п. 345. ISBN  9780321563842.
  70. ^ Страуструп, Бьярн (2013). Язык программирования C ++. Эддисон Уэсли. С. 363–365. ISBN  9780321563842.
  71. ^ Страуструп, Бьярн (2013). Язык программирования C ++. Эддисон Уэсли. С. 345, 363. ISBN  9780321563842.
  72. ^ "Руководство по стилю Google C ++". Получено 25 июн 2019.
  73. ^ «Стандарты кодирования LLVM». Документация LLVM 9. Получено 25 июн 2019.
  74. ^ «Соглашения о кодировании». Qt Wiki. Получено 26 июн 2019.
  75. ^ Страуструп, Бьярн (2013). Язык программирования C ++. Эддисон Уэсли. С. 344, 370. ISBN  9780321563842.
  76. ^ Страуструп, Бьярн (2013). Язык программирования C ++. Эддисон Уэсли. п. 349. ISBN  9780321563842.
  77. ^ Грациано Ло Руссо (2008). «Интервью с А. Степановым». stlport.org. Получено 8 октября 2015.
  78. ^ «Основные принципы C ++».
  79. ^ «Бьярн Страуструп объявляет о рекомендациях по ядру C ++».
  80. ^ «Библиотека поддержки рекомендаций».
  81. ^ «Используйте средства проверки основных рекомендаций C ++».
  82. ^ "Резюме C ++ ABI". 20 марта 2001 г.. Получено 30 мая 2006.
  83. ^ "Часто задаваемые вопросы Бьярна Страуструпа - C является подмножеством C ++?". Получено 5 мая 2014.
  84. ^ «C9X - Новый стандарт C». Получено 27 декабря 2008.
  85. ^ «Поддержка C ++ 0x в GCC». Получено 12 октября 2010.
  86. ^ "Основные возможности языка C ++ 0x в VC10: Таблица". Получено 12 октября 2010.
  87. ^ «Clang - Статус C ++ 98, C ++ 11 и C ++ 14». Clang.llvm.org. 12 мая 2013. Получено 10 июн 2013.
  88. ^ «Re: [RFC] Преобразуйте файл buildin-mailinfo.c для использования библиотеки Better String Library» (Список рассылки). 6 сентября 2007 г.. Получено 31 марта 2015.
  89. ^ "Re: Попытки привлечь больше пользователей?" (Список рассылки). 12 июля 2010 г.. Получено 31 марта 2015.
  90. ^ Эндрю Бинсток (18 мая 2011 г.). "Доктор Добб: Интервью с Кеном Томпсоном". Получено 7 февраля 2014.
  91. ^ а б Питер Сейбель (16 сентября 2009 г.). Кодеры за работой: размышления о ремесле программирования. Апресс. С. 475–476. ISBN  978-1-4302-1948-4.
  92. ^ а б https://gigamonkeys.wordpress.com/2009/10/16/coders-c-plus-plus/
  93. ^ а б https://www.drdobbs.com/architecture-and-design/an-interview-with-donald-knuth/228700500
  94. ^ а б http://tex.loria.fr/litte/knuth-interview
  95. ^ Брайан Керниган (18 июля 2018 г.). Брайан Керниган, вопросы и ответы - компьютерщик.
  96. ^ http://www.stroustrup.com/bs_faq.html#really-say-that
  97. ^ Пайк, Роб (2012). "Меньше значит экспоненциально больше".
  98. ^ Крейнин, Йосси (13 октября 2009 г.). «Дефектный C ++». Получено 3 февраля 2016.

дальнейшее чтение

внешние ссылки