С++
Эта статья нуждается в дополнительных цитатах для проверки . ( март 2024 г. ) |
++ ( / ˈs iː C p l ʌ s p l ʌ s / , произносится как « C plus plus » и иногда сокращается как CPP ) — высокоуровневый , язык программирования общего назначения созданный датским ученым-компьютерщиком Бьярном Страуструпом . Впервые выпущенный в 1985 году как расширение языка программирования C , с тех пор он значительно расширился; по состоянию на 1997 год [update]C++ обладает объектно-ориентированными , универсальными и функциональными возможностями в дополнение к средствам низкоуровневого памятью манипулирования для таких систем, как микрокомпьютеры , или для создания операционных систем, таких как Linux или Windows . Обычно он реализуется как компилируемый язык , и многие поставщики предоставляют компиляторы C++ , включая Free Software Foundation , LLVM , Microsoft , Intel , Embarcadero , Oracle и IBM . [14]
C++ был разработан с учетом системного программирования , встроенного программного обеспечения с ограниченными ресурсами и больших систем, а его основные характеристики — производительность , эффективность и гибкость использования. [15] C++ также оказался полезным во многих других контекстах, при этом ключевыми сильными сторонами являются инфраструктура программного обеспечения и приложения с ограниченными ресурсами. [15] включая настольные приложения , видеоигры , серверы (например, электронная коммерция , веб-поиск или базы данных ) и приложения, критически важные для производительности (например, телефонные коммутаторы или космические зонды ). [16]
C++ стандартизирован Международной организацией по стандартизации (ISO), причем последняя версия стандарта ратифицирована и опубликована ISO в декабре 2020 года как ISO/IEC 14882:2020 (неофициально известная как C++20 ). [17] Язык программирования C++ был первоначально стандартизирован в 1998 году как ISO/IEC 14882:1998 , в который затем были внесены поправки стандартами C++03 , C++11 , C++14 и C++17 . Текущий стандарт C++20 заменяет их новыми функциями и расширенной стандартной библиотекой . До первоначальной стандартизации в 1998 году C++ разрабатывался Страуструпом в Bell Labs с 1979 года как расширение языка C; ему нужен был эффективный и гибкий язык, подобный C, который также обеспечивал бы высокоуровневые функции для организации программ. [18] С 2012 года выпуск C++ осуществляется по трехлетнему графику. [19] с C++23 в качестве следующего запланированного стандарта. [20]
История
[ редактировать ]В 1979 году Бьёрн Страуструп , датский учёный-компьютерщик , начал работу над « C с классами », предшественник C++. [21] Мотивацией к созданию нового языка послужил опыт Страуструпа в программировании для его докторской диссертации. Страуструп обнаружил, что Simula имеет функции, которые очень полезны для разработки крупного программного обеспечения, но язык слишком медленный для практического использования, а BCPL работает быстро, но слишком низкоуровнево, чтобы подходить для разработки крупного программного обеспечения. Когда Страуструп начал работать в AT&T Bell Labs , у него возникла проблема анализа UNIX ядра с точки зрения распределенных вычислений . Вспомнив свой докторский опыт, Страуструп решил улучшить язык C с помощью функций, подобных Simula . [22] Был выбран язык C, потому что он был универсальным, быстрым, портативным и широко используемым. Помимо влияния C и Simula, на этот новый язык повлияли и другие языки, включая ALGOL 68 , Ada , CLU и ML . [ нужна ссылка ]
Первоначально «C с классами» Страуструпа добавлял функции в компилятор C Cpre, включая классы , производные классы , строгую типизацию , встраивание и аргументы по умолчанию . [23]
В 1982 году Страуструп начал разработку преемника C с классами, который он назвал «C++» ( ++
являющийся оператором приращения в C) после прохождения нескольких других имен. Были добавлены новые функции, в том числе виртуальные функции , имена функций и перегрузка операторов , ссылки , константы, типобезопасное выделение памяти свободного хранилища (новое/удаление), улучшенная проверка типов и однострочные комментарии в стиле BCPL с двумя косыми чертами ( //
). Кроме того, Страуструп разработал новый автономный компилятор для C++ — Cfront .
В 1984 году Страуструп реализовал первую библиотеку потокового ввода/вывода. Идея предоставления оператора вывода, а не именованной функции вывода, была предложена Дугом Макилроем. [2] (который ранее предлагал каналы Unix ).
В 1985 году было выпущено первое издание « Языка программирования C++» , которое стало окончательным справочником по языку, поскольку официального стандарта еще не было. [24] Первая коммерческая реализация C++ была выпущена в октябре того же года. [21]
В 1989 году был выпущен C++ 2.0, а в 1991 году последовало обновленное второе издание The C++ Programming Language . [25] Новые возможности версии 2.0 включали множественное наследование, абстрактные классы, статические функции-члены, константные функции-члены и защищенные члены. В 1990 году Аннотированное справочное руководство по C++ было опубликовано . Эта работа легла в основу будущего стандарта. Более поздние дополнения включали шаблоны , исключения , пространства имен , новые приведения и логический тип .
В 1998 году был выпущен C++98, стандартизировавший язык, а в 2003 году было выпущено незначительное обновление ( C++03 ).
После C++98 C++ развивался относительно медленно, пока в 2011 году не был выпущен стандарт C++11 , в котором было добавлено множество новых функций, дальнейшее расширение стандартной библиотеки и предоставление дополнительных возможностей программистам C++. После небольшого обновления C++14 были введены различные новые дополнения , выпущенного в декабре 2014 года, в C++17 . [26] После завершения в феврале 2020 года [27] проект стандарта C++20 был одобрен 4 сентября 2020 года и официально опубликован 15 декабря 2020 года. [28] [29]
3 января 2018 года Страуструп был объявлен лауреатом Премии Чарльза Старка Дрейпера в области инженерии 2018 года «за концептуализацию и разработку языка программирования C++». [30]
По состоянию на декабрь 2022 г. [update]C++ занял третье место в индексе TIOBE обогнав Java , впервые в истории индекса . Он занимает третье место Python и C. после [31]
Этимология
[ редактировать ]По мнению Страуструпа, «название указывает на эволюционный характер изменений от C». [32] Это имя приписывают Рику Маскитти (середина 1983 г.). [23] и впервые был использован в декабре 1983 года. Когда в 1992 году Масцитти неофициально допросили по поводу названия, он указал, что оно было дано в насмешливом духе. Название происходит от буквы C ++
оператор (который увеличивает значение , переменной . ) и общепринятое соглашение об именах использующее «+» для обозначения расширенной компьютерной программы
В период разработки C++ этот язык называли «новым C» и «C с классами». [23] [33] до получения своего окончательного названия.
Философия
[ редактировать ]На протяжении всего существования C++ его развитие и эволюция руководствовались рядом принципов: [22]
- Он должен быть основан на реальных проблемах, и его функции должны быть немедленно полезны в реальных программах.
- Каждая функция должна быть реализуемой (с достаточно очевидным способом сделать это).
- Программисты должны иметь свободу выбирать свой собственный стиль программирования, и этот стиль должен полностью поддерживаться C++.
- Разрешение полезной функции важнее, чем предотвращение любого возможного неправильного использования C++.
- Он должен обеспечивать возможности для организации программ в отдельные, четко определенные части и обеспечивать возможности для объединения отдельно разработанных частей.
- Никаких неявных нарушений системы типов (но допускаются явные нарушения, то есть те, которые явно запрошены программистом).
- Типы, созданные пользователем, должны иметь ту же поддержку и производительность, что и встроенные типы.
- Неиспользуемые функции не должны негативно влиять на создаваемые исполняемые файлы (например, снижать производительность).
- Ниже C++ не должно быть языка (кроме ассемблера ).
- C++ должен работать вместе с другими существующими языками программирования , а не создавать собственную отдельную и несовместимую среду программирования .
- Если намерение программиста неизвестно, позвольте программисту указать его, обеспечив ручное управление.
Стандартизация
[ редактировать ]Год | Стандарт ИСО/МЭК | Неофициальное имя |
---|---|---|
1998 | 14882:1998 [34] | С++98 |
2003 | 14882:2003 [35] | С++03 |
2011 | 14882:2011 [36] | С++11 , С++0x |
2014 | 14882:2014 [37] | С++14 , С++1y |
2017 | 14882:2017 [38] | С++17 , С++1z |
2020 | 14882:2020 [17] | С++20 , С++2а |
будет объявлено позднее | С++23 , С++2b | |
будет объявлено позднее | С++26 , С++2с |
C++ стандартизирован рабочей группой ISO , известной как JTC1/SC22/WG21 . На данный момент компания опубликовала шесть редакций стандарта C++ и в настоящее время работает над следующей редакцией — C++23 .
В 1998 году рабочая группа ISO впервые стандартизировала C++ как ISO/IEC 14882:1998 , который неофициально известен как C++98 . В 2003 году была опубликована новая версия стандарта C++ под названием ISO/IEC 14882:2003 , которая исправила проблемы, выявленные в C++98.
Следующая крупная версия стандарта неофициально называлась «C++0x», но была выпущена только в 2011 году. [39] C++11 (14882:2011) включал множество дополнений как к основному языку, так и к стандартной библиотеке. [36]
В 2014 году C++14 (также известный как C++1y) был выпущен как небольшое расширение C++11, содержащее в основном исправления ошибок и небольшие улучшения. [40] Процедуры голосования по проекту международного стандарта завершились в середине августа 2014 года. [41]
После C++14 основная версия C++17 , неофициально известная как C++1z, была завершена комитетом ISO C++ в середине июля 2017 года и одобрена и опубликована в декабре 2017 года. [42]
В рамках процесса стандартизации ISO также публикует технические отчеты и спецификации :
- ИСО/МЭК ТР 18015:2006 [43] об использовании C++ во встроенных системах и о влиянии на производительность функций языка и библиотеки C++,
- ИСО/МЭК ТР 19768:2007 [44] (также известный как Технический отчет C++ 1 ) о расширениях библиотек, в основном интегрированных в C++11 ,
- ИСО/МЭК ТР 29124:2010 [45] о специальных математических функциях, интегрированных в C++17 ,
- ИСО/МЭК ТР 24733:2011 [46] по с плавающей запятой , десятичной арифметике
- ИСО/МЭК ТС 18822:2015 [47] в стандартной библиотеке файловой системы, интегрированной в C++17 ,
- ИСО/МЭК ТС 19570:2015 [48] на параллельных версиях алгоритмов стандартной библиотеки, интегрированных в C++17 ,
- ИСО/МЭК ТС 19841:2015 [49] о программной транзакционной памяти ,
- ИСО/МЭК ТС 19568:2015 [50] о новом наборе расширений библиотеки, некоторые из которых уже интегрированы в C++17 ,
- ИСО/МЭК ТС 19217:2015 [51] C++ о концепциях , интегрированных в C++20 ,
- ИСО/МЭК ТС 19571:2016 [52] о расширениях библиотеки для параллелизма, некоторые из которых уже интегрированы в C++20 ,
- ИСО/МЭК ТС 19568:2017 [53] о новом наборе расширений библиотеки общего назначения,
- ИСО/МЭК ТС 21425:2017 [54] о расширениях библиотеки для диапазонов, интегрированных в C++20 ,
- ИСО/МЭК ТС 22277:2017 [55] на сопрограммах, интегрированных в C++20 ,
- ИСО/МЭК ТС 19216:2018 [56] в сетевой библиотеке,
- ИСО/МЭК ТС 21544:2018 [57] на модулях, интегрированных в C++20 ,
- ИСО/МЭК ТС 19570:2018 [58] о новом наборе расширений библиотеки для параллелизма и
- ИСО/МЭК ТС 23619:2021 [59] о новых расширениях для размышления.
Другие технические спецификации находятся в разработке и ожидают утверждения, включая новый набор расширений параллелизма.
Язык
[ редактировать ]Язык C++ имеет два основных компонента: прямое отображение аппаратных функций, предоставляемое в основном подмножеством C, и абстракции с нулевыми издержками, основанные на этих отображениях. Страуструп описывает C++ как «легкий язык программирования абстракций, [разработанный] для создания и использования эффективных и элегантных абстракций»; [15] и «предложение как аппаратного доступа, так и абстракции является основой C++. Эффективное выполнение — вот что отличает его от других языков». [60]
наследует большую часть синтаксиса C. C ++ Программа hello world, соответствующая стандарту C, также является допустимой программой hello word на C++. Ниже приведена версия программы Hello world от Бьярна Страуструпа , которая использует функцию потока стандартной библиотеки C++ для записи сообщения в стандартный вывод : [61] [62] [примечание 2]
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";
}
Хранилище объектов
[ редактировать ]Как и в C, C++ поддерживает четыре типа управления памятью : статические объекты продолжительности хранения, объекты продолжительности хранения потока, автоматические объекты продолжительности хранения и объекты динамической продолжительности хранения. [63]
Статические объекты продолжительности хранения
[ редактировать ]Статические объекты длительности хранения создаются до main()
вводится (см. исключения ниже) и уничтожается в порядке, обратном созданию после main()
выходит. Точный порядок создания не указан в стандарте (хотя некоторые правила определены ниже), чтобы предоставить реализациям некоторую свободу в организации их реализации. Более формально, объекты этого типа имеют срок службы, который «должен длиться в течение всего срока действия программы». [64]
Статические объекты продолжительности хранения инициализируются в два этапа. Сначала выполняется «статическая инициализация», и только после того, как выполнена вся статическая инициализация, выполняется «динамическая инициализация». При статической инициализации все объекты сначала инициализируются нулями; после этого все объекты, имеющие постоянную фазу инициализации, инициализируются константным выражением (т.е. переменные, инициализируемые литералом или constexpr
). Хотя это не указано в стандарте, фаза статической инициализации может быть завершена во время компиляции и сохранена в разделе данных исполняемого файла. Динамическая инициализация включает в себя всю инициализацию объекта, выполняемую с помощью конструктора или вызова функции (если функция не помечена значком constexpr
, в С++11). Порядок динамической инициализации определяется как порядок объявления внутри единицы компиляции (т. е. в том же файле). Никаких гарантий относительно порядка инициализации между модулями компиляции не предоставляется.
Объекты длительности хранения потока
[ редактировать ]Переменные этого типа очень похожи на статические объекты длительности хранения. Основное отличие заключается в том, что время создания происходит непосредственно перед созданием потока, а уничтожение происходит после присоединения потока. [65]
Объекты продолжительности автоматического хранения
[ редактировать ]Наиболее распространенными типами переменных в C++ являются локальные переменные внутри функции или блока и временные переменные. [66] Общей особенностью автоматических переменных является то, что их время существования ограничено областью действия переменной. Они создаются и потенциально инициализируются в момент объявления (подробности см. ниже) и уничтожаются в порядке, обратном созданию, при выходе из области видимости. Это реализуется путем распределения в стеке .
Локальные переменные создаются, когда точка выполнения проходит точку объявления. Если переменная имеет конструктор или инициализатор, он используется для определения начального состояния объекта. Локальные переменные уничтожаются, когда закрывается локальный блок или функция, в которой они объявлены. Деструкторы C++ для локальных переменных вызываются в конце жизни объекта, что позволяет использовать дисциплину автоматического управления ресурсами, называемую RAII , которая широко используется в C++.
Переменные-члены создаются при создании родительского объекта. Члены массива инициализируются от 0 до последнего члена массива по порядку. Переменные-члены уничтожаются, когда родительский объект уничтожается в порядке, обратном созданию. т.е. если родительский объект является «автоматическим объектом», то он будет уничтожен, когда выйдет за пределы области действия, что приведет к уничтожению всех его членов.
Временные переменные создаются в результате вычисления выражения и уничтожаются, когда оператор, содержащий выражение, был полностью вычислен (обычно в ;
в конце заявления).
Объекты продолжительности динамического хранения
[ редактировать ]Эти объекты имеют динамическую продолжительность жизни и могут быть созданы непосредственно с помощью вызова new
и уничтожается явно с помощью вызова delete
. [67] C++ также поддерживает malloc
и free
, из C, но они несовместимы с new
и delete
. Использование new
возвращает адрес выделенной памяти. Основные рекомендации C++ не рекомендуют использовать new
непосредственно для создания динамических объектов в пользу интеллектуальных указателей посредством make_unique<T>
на единоличное владение и make_shared<T>
для многократного владения с подсчетом ссылок, [68] которые были представлены в C++11.
Шаблоны
[ редактировать ]Шаблоны C++ позволяют создавать универсальное программирование . C++ поддерживает шаблоны функций, классов, псевдонимов и переменных. Шаблоны могут параметризоваться типами, константами времени компиляции и другими шаблонами. Шаблоны реализуются путем создания экземпляров во время компиляции. Чтобы создать экземпляр шаблона, компиляторы заменяют параметры шаблона конкретными аргументами для создания конкретного экземпляра функции или класса. Некоторые замены невозможны; они устраняются с помощью политики разрешения перегрузок, описываемой фразой « Ошибка замены не является ошибкой » (SFINAE). Шаблоны — это мощный инструмент, который можно использовать для общего программирования , метапрограммирования шаблонов и оптимизации кода, но эта мощь подразумевает затраты. Использование шаблона может увеличить размер объектного кода , поскольку каждая реализация шаблона создает копию кода шаблона: по одной для каждого набора аргументов шаблона, однако это тот же или меньший объем кода, который был бы сгенерирован, если бы код был написан вручную. . [69] В этом отличие от дженериков времени выполнения, встречающихся в других языках (например, Java ), где во время компиляции тип стирается и сохраняется одно тело шаблона.
Шаблоны отличаются от макросов : хотя обе эти функции языка времени компиляции допускают условную компиляцию, шаблоны не ограничиваются лексической заменой. Шаблоны учитывают семантику и систему типов своего сопутствующего языка, а также все определения типов во время компиляции и могут выполнять операции высокого уровня, включая программное управление потоком данных, на основе оценки параметров, строго проверяемых по типу. Макросы способны осуществлять условный контроль над компиляцией на основе заранее определенных критериев, но не могут создавать экземпляры новых типов, рекурсивно или выполнять оценку типа и, по сути, ограничиваются заменой текста перед компиляцией и включением/исключением текста. Другими словами, макросы могут управлять потоком компиляции на основе заранее определенных символов, но не могут, в отличие от шаблонов, независимо создавать экземпляры новых символов. Шаблоны — это инструмент статического полиморфизма (см. ниже) и обобщенного программирования .
Кроме того, шаблоны — это механизм времени компиляции в C++, который является полным по Тьюрингу , что означает, что любое вычисление, выражаемое компьютерной программой, может быть вычислено в той или иной форме с помощью метапрограммы шаблона до времени выполнения.
Короче говоря, шаблон — это параметризованная функция или класс во время компиляции, написанная без знания конкретных аргументов, используемых для его создания. После создания экземпляра результирующий код эквивалентен коду, написанному специально для переданных аргументов. Таким образом, шаблоны позволяют отделить общие, широко применимые аспекты функций и классов (закодированные в шаблонах) от конкретных аспектов (закодированных в параметрах шаблона) без ущерба для производительности из-за абстракции.
Объекты
[ редактировать ]C++ вводит в C функции объектно-ориентированного программирования (ООП). Он предлагает классы , которые предоставляют четыре функции, обычно присутствующие в ООП (и некоторых не-ООП) языках: абстракция , инкапсуляция , наследование и полиморфизм . Одной из отличительных особенностей классов C++ по сравнению с классами других языков программирования является поддержка детерминированных деструкторов , которые, в свою очередь, обеспечивают поддержку концепции Resource Acquisition is Initialization (RAII).
Инкапсуляция
[ редактировать ]Инкапсуляция — это сокрытие информации, позволяющее гарантировать, что структуры данных и операторы используются по назначению, а также сделать модель использования более очевидной для разработчика. C++ предоставляет возможность определять классы и функции в качестве основных механизмов инкапсуляции. Внутри класса члены могут быть объявлены как открытые, защищенные или частные, чтобы явно обеспечить инкапсуляцию. Открытый член класса доступен для любой функции. Закрытый член доступен только функциям, которые являются членами этого класса, а также функциям и классам, которым класс явно предоставил разрешение на доступ («друзья»). Защищенный член доступен членам классов, которые наследуются от класса, а также самому классу и всем его друзьям.
Объектно-ориентированный принцип обеспечивает инкапсуляцию всех и только тех функций, которые обращаются к внутреннему представлению типа. C++ поддерживает этот принцип через функции-члены и дружественные функции, но не обеспечивает его соблюдение. Программисты могут объявить части или все представления типа общедоступными, и им разрешено делать общедоступные объекты не частью представления типа. Таким образом, C++ поддерживает не только объектно-ориентированное программирование, но и другие парадигмы декомпозиции, такие как модульное программирование .
Обычно считается хорошей практикой делать все данные конфиденциальными или защищенными и публиковать только те функции, которые являются частью минимального интерфейса для пользователей класса. Это может скрыть детали реализации данных, позволяя разработчику позже фундаментально изменить реализацию, никак не меняя интерфейс. [70] [71]
Наследование
[ редактировать ]Наследование позволяет одному типу данных приобретать свойства других типов данных. Наследование базового класса может быть объявлено как открытое, защищенное или частное. Этот спецификатор доступа определяет, могут ли несвязанные и производные классы получать доступ к унаследованным общедоступным и защищенным членам базового класса. Только публичное наследование соответствует тому, что обычно подразумевается под «наследованием». Две другие формы используются гораздо реже. Если спецификатор доступа опущен, «класс» наследуется конфиденциально, а «структура» наследуется публично. Базовые классы могут быть объявлены виртуальными; это называется виртуальным наследованием . Виртуальное наследование гарантирует, что в графе наследования существует только один экземпляр базового класса, что позволяет избежать некоторых проблем неоднозначности, связанных с множественным наследованием.
Множественное наследование — это функция C++, позволяющая получить класс от более чем одного базового класса; это позволяет создавать более сложные отношения наследования. Например, класс «Летающий кот» может наследовать как класс «Кошка», так и класс «Летающее млекопитающее». Некоторые другие языки, такие как C# или Java , выполняют нечто похожее (хотя и более ограниченное), позволяя наследовать несколько интерфейсов , ограничивая при этом количество базовых классов одним (интерфейсы, в отличие от классов, предоставляют только объявления функций-членов, а не реализацию или членство). данные). Интерфейс, как в C# и Java, может быть определен в C++ как класс, содержащий только чистые виртуальные функции, часто известный как абстрактный базовый класс или «ABC». Функции-члены такого абстрактного базового класса обычно явно определяются в производном классе, а не наследуются неявно. Виртуальное наследование C++ демонстрирует функцию разрешения неоднозначности, называемую доминированием .
Операторы и перегрузка операторов
[ редактировать ]Оператор | Символ |
---|---|
Разрешение области | ::
|
Условный | ?:
|
точка | .
|
Выбор участника | .*
|
" размер " | sizeof
|
" типизированный " | typeid
|
C++ предоставляет более 35 операторов, охватывающих базовую арифметику, битовые манипуляции, косвенность, сравнения, логические операции и другие. Почти все операторы могут быть перегружены для пользовательских типов, за некоторыми заметными исключениями, такими как доступ к членам ( .
и .*
) и условный оператор. Богатый набор перегружаемых операторов играет центральную роль в том, чтобы пользовательские типы в C++ выглядели как встроенные типы.
Перегружаемые операторы также являются важной частью многих продвинутых методов программирования на C++, таких как интеллектуальные указатели . Перегрузка оператора не меняет приоритет вычислений с участием этого оператора и не меняет количество операндов, которые использует оператор (однако любой операнд может быть проигнорирован оператором, хотя он будет оценен до выполнения). Перегружен" &&
" и " ||
«Операторы теряют свойство оценки короткого замыкания .
Полиморфизм
[ редактировать ]Полиморфизм позволяет использовать один общий интерфейс для многих реализаций, а также позволяет объектам действовать по-разному в разных обстоятельствах.
C++ поддерживает несколько видов статического (разрешаемого во время компиляции ) и динамического (разрешаемого во время выполнения ) полиморфизмов , поддерживаемых функциями языка, описанными выше. Полиморфизм во время компиляции не позволяет принимать определенные решения во время выполнения, в то время как полиморфизм во время выполнения обычно влечет за собой снижение производительности.
Статический полиморфизм
[ редактировать ]Перегрузка функций позволяет программам объявлять несколько функций с одинаковым именем, но с разными аргументами (т. е. специальный полиморфизм ). Функции различаются количеством или типами формальных параметров . Таким образом, одно и то же имя функции может относиться к разным функциям в зависимости от контекста, в котором оно используется. Тип, возвращаемый функцией, не используется для различения перегруженных функций, а разные типы возвращаемых значений могут привести к сообщению об ошибке во время компиляции.
При объявлении функции программист может указать для одного или нескольких параметров значение по умолчанию . Это позволяет опционально опускать параметры со значениями по умолчанию при вызове функции, и в этом случае будут использоваться аргументы по умолчанию. Когда функция вызывается с меньшим количеством аргументов, чем объявлено, явные аргументы сопоставляются с параметрами в порядке слева направо, при этом всем несовпадающим параметрам в конце списка параметров присваиваются аргументы по умолчанию. Во многих случаях указание аргументов по умолчанию в одном объявлении функции предпочтительнее, чем предоставление перегруженных определений функций с различным количеством параметров.
Шаблоны в C++ предоставляют сложный механизм для написания универсального полиморфного кода (т. е. параметрического полиморфизма ). В частности, посредством любопытно повторяющегося шаблона шаблона можно реализовать форму статического полиморфизма, которая точно имитирует синтаксис переопределения виртуальных функций. Поскольку шаблоны C++ учитывают типы и являются полными по Тьюрингу , их также можно использовать, чтобы позволить компилятору разрешать рекурсивные условия и генерировать полноценные программы посредством метапрограммирования шаблонов . Вопреки распространенному мнению, код шаблона не будет генерировать объемный код после компиляции с соответствующими настройками компилятора. [69]
Динамический полиморфизм
[ редактировать ]Наследование
[ редактировать ]Указатели переменных и ссылки на тип базового класса в C++ также могут ссылаться на объекты любых производных классов этого типа. Это позволяет массивам и другим типам контейнеров хранить указатели на объекты разных типов (ссылки не могут храниться непосредственно в контейнерах). Это обеспечивает динамический (во время выполнения) полиморфизм, при котором указанные объекты могут вести себя по-разному в зависимости от их (фактических, производных) типов.
C++ также предоставляет dynamic_cast
оператор, который позволяет коду безопасно попытаться преобразовать объект через базовую ссылку/указатель в более производный тип: понижающее приведение . Попытка необходима , поскольку часто неизвестно, на какой производный тип ссылаются. ( Upcasting , преобразование в более общий тип, всегда можно проверить/выполнить во время компиляции с помощью static_cast
, поскольку наследственные классы указаны в интерфейсе производного класса и видны всем вызывающим объектам.) dynamic_cast
полагается на информацию о типах во время выполнения (RTTI), метаданные в программе, которые позволяют различать типы и их отношения. Если dynamic_cast
к указателю не удается, результатом является nullptr
константа, тогда как, если пункт назначения является ссылкой (которая не может быть нулевой), приведение выдает исключение. Объекты, о которых известно , что они принадлежат к определенному производному типу, могут быть приведены к нему с помощью static_cast
, минуя RTTI и безопасную проверку типов во время выполнения dynamic_cast
, поэтому его следует использовать только в том случае, если программист очень уверен, что приведение типов действительно и всегда будет действительным.
Виртуальные функции-члены
[ редактировать ]Обычно, когда функция в производном классе переопределяет функцию в базовом классе, вызываемая функция определяется типом объекта. Данная функция переопределяется, если между двумя или более определениями этой функции нет разницы в количестве или типе параметров. Следовательно, во время компиляции может быть невозможно определить тип объекта и, следовательно, правильную функцию для вызова, имея только указатель базового класса; поэтому решение откладывается до времени выполнения. Это называется динамической отправкой . Виртуальные функции-члены или методы [72] разрешить вызов наиболее конкретной реализации функции в соответствии с фактическим типом объекта во время выполнения. В реализациях C++ это обычно делается с помощью таблиц виртуальных функций . Если тип объекта известен, это можно обойти, добавив полное имя класса перед вызовом функции, но обычно вызовы виртуальных функций разрешаются во время выполнения.
Помимо стандартных функций-членов, виртуальными могут быть перегрузки операторов и деструкторы. Неточное правило, основанное на практическом опыте, гласит, что если какая-либо функция в классе является виртуальной, то и деструктор тоже должен быть виртуальным. Поскольку тип объекта при его создании известен во время компиляции, конструкторы и, соответственно, конструкторы копирования не могут быть виртуальными. Тем не менее, может возникнуть ситуация, когда необходимо создать копию объекта, когда указатель на производный объект передается как указатель на базовый объект. В таком случае общим решением является создание clone()
(или подобная) виртуальная функция, которая создает и возвращает копию производного класса при вызове.
Функцию-член также можно сделать «чисто виртуальной», добавив к ней = 0
после закрывающей скобки и перед точкой с запятой. Класс, содержащий чисто виртуальную функцию, называется абстрактным классом . Объекты не могут быть созданы из абстрактного класса; они могут быть получены только из. Любой производный класс наследует виртуальную функцию как чистую и должен предоставить ее нечистое определение (и всех других чистых виртуальных функций), прежде чем можно будет создать объекты производного класса. Программа, которая пытается создать объект класса с чисто виртуальной функцией-членом или унаследовала чисто виртуальную функцию-член, является неправильной.
Лямбда-выражения
[ редактировать ]C++ обеспечивает поддержку анонимных функций , также известных как лямбда-выражения , в следующей форме:
[capture](parameters) -> return_type { function_body }
Начиная с C++20, ключевое слово template
является необязательным для параметров шаблона лямбда-выражений:
[capture]<template_parameters>(parameters) -> return_type { function_body }
Если лямбда-выражение не принимает параметров и не используется тип возвращаемого значения или другие спецификаторы, то () можно опустить; то есть,
[capture] { function_body }
Если возможно, тип возвращаемого значения лямбда-выражения можно определить автоматически; например:
[](int x, int y) { return x + y; } // inferred
[](int x, int y) -> int { return x + y; } // explicit
The [capture]
list поддерживает определение замыканий . Такие лямбда-выражения определены в стандарте как синтаксический сахар для безымянного функционального объекта .
Обработка исключений
[ редактировать ]Обработка исключений используется для передачи информации о существовании проблемы или ошибки во время выполнения из того места, где она была обнаружена, туда, где проблема может быть решена. [73] Он позволяет делать это единообразно и отдельно от основного кода, обнаруживая при этом все ошибки. [74] В случае возникновения ошибки генерируется (поднимается) исключение, которое затем перехватывается ближайшим подходящим обработчиком исключений. Исключение вызывает выход из текущей области, а также из каждой внешней области (распространение) до тех пор, пока не будет найден подходящий обработчик, вызывая, в свою очередь, деструкторы любых объектов в этих завершенных областях. [75] При этом исключение представляется как объект, несущий данные об обнаруженной проблеме. [76]
Некоторые руководства по стилю C++, например Google, [77] ЛЛВМ, [78] и Qt, [79] запретить использование исключений.
Код, вызывающий исключение, помещается внутри try
блокировать. Исключения обрабатываются отдельно. catch
блоки (обработчики); каждый try
блок может иметь несколько обработчиков исключений, как это видно в примере ниже. [80]
#include <iostream>
#include <vector>
#include <stdexcept>
int main() {
try {
std::vector<int> vec{3, 4, 3, 1};
int i{vec.at(4)}; // Throws an exception, std::out_of_range (indexing for vec is from 0-3 not 1-4)
}
// An exception handler, catches std::out_of_range, which is thrown by vec.at(4)
catch (const std::out_of_range &e) {
std::cerr << "Accessing a non-existent element: " << e.what() << '\n';
}
// To catch any other standard library exceptions (they derive from std::exception)
catch (const std::exception &e) {
std::cerr << "Exception thrown: " << e.what() << '\n';
}
// Catch any unrecognised exceptions (i.e. those which don't derive from std::exception)
catch (...) {
std::cerr << "Some fatal error\n";
}
}
Также возможно целенаправленно создавать исключения, используя throw
ключевое слово; эти исключения обрабатываются обычным способом. В некоторых случаях исключения не могут быть использованы по техническим причинам. Одним из таких примеров является критический компонент встроенной системы, где каждая операция должна быть гарантированно завершена в течение определенного периода времени. Это невозможно определить с помощью исключений, поскольку не существует инструментов для определения максимального времени, необходимого для обработки исключения. [81]
В отличие от обработки сигналов , в которой функция обработки вызывается из точки сбоя, обработка исключений выходит из текущей области до того, как будет введен блок catch, который может находиться в текущей функции или любом из предыдущих вызовов функций, находящихся в настоящее время в стеке.
Перечислимые типы
[ редактировать ]В C++ есть типы перечислений, которые напрямую унаследованы от C и работают в основном аналогично этим, за исключением того, что перечисление является реальным типом в C++, что обеспечивает дополнительную проверку во время компиляции. Кроме того (как и в случае со структурами), C++ enum
ключевое слово сочетается с typedef , чтобы вместо присвоения имени типу enum name
, просто назовите его name
. Это можно смоделировать в C, используя typedef: typedef enum {Value1, Value2} name;
В C++11 также предусмотрен второй вид перечисления, называемый перечислением с ограниченной областью действия . Они типобезопасны: перечислители не преобразуются неявно в целочисленный тип. Помимо прочего, это позволяет определить потоковую передачу ввода-вывода для типа перечисления. Другая особенность перечислений с ограниченной областью заключается в том, что перечислители не утекают, поэтому для их использования требуется префикс с именем перечисления (например, Color::Red
для первого перечислителя в приведенном ниже примере), если только using enum
Объявление (представленное в C++20 ) использовалось для перевода перечислителей в текущую область. Ограниченное перечисление задается фразой enum class
(или enum struct
). Например:
enum class Color {Red, Green, Blue};
Базовый тип перечисления — это определяемый реализацией целочисленный тип, достаточно большой для хранения всех перечисляемых значений; это не обязательно должен быть наименьший возможный тип. Базовый тип может быть указан напрямую, что позволяет «упреждающие объявления» перечислений:
enum class Color : long {Red, Green, Blue}; // must fit in size and memory layout the type 'long'
enum class Shapes : char; // forward declaration. If later there are values defined that don't fit in 'char' it is an error.
Стандартная библиотека
[ редактировать ]C++ Стандарт состоит из двух частей: основного языка и стандартной библиотеки. Программисты C++ ожидают последнего в каждой крупной реализации C++; он включает в себя совокупные типы ( векторы , списки, карты, наборы, очереди, стеки, массивы, кортежи), алгоритмы (find, for_each , binary_search , random_shuffle и т. д.), средства ввода/вывода ( iostream , для чтения и записи в консоль и файлы), библиотека файловой системы, поддержка локализации, интеллектуальные указатели для автоматического управления памятью, поддержка регулярных выражений , многопоточная библиотека, поддержка атомики (позволяет читать или записывать переменную не более чем одним потоком за раз без каких-либо внешних синхронизация), утилиты времени (измерение, получение текущего времени и т. д.), система преобразования отчетов об ошибках, не использующих исключений C++ , в исключения C++, генератор случайных чисел и слегка модифицированная версия стандартной библиотеки C (чтобы сделать он соответствует системе типов C++).
Большая часть библиотеки C++ основана на стандартной библиотеке шаблонов (STL). Полезные инструменты, предоставляемые STL, включают контейнеры в виде коллекций объектов (таких как векторы и списки ), итераторы , обеспечивающие доступ к контейнерам наподобие массива, и алгоритмы , выполняющие такие операции, как поиск и сортировка.
(мульти)карты ( ассоциативные массивы Кроме того, предоставляются ) и (мульти)наборы, все из которых экспортируют совместимые интерфейсы. Следовательно, используя шаблоны, можно писать универсальные алгоритмы, которые работают с любым контейнером или с любой последовательностью, определенной итераторами. Как и в C, функциям библиотеки доступ к осуществляется с помощью #include
директива для включения стандартного заголовка . Стандартная библиотека C++ предоставляет 105 стандартных заголовков, 27 из которых устарели.
Стандарт включает в себя STL, первоначально разработанный Александром Степановым , который много лет экспериментировал с универсальными алгоритмами и контейнерами. Когда он начал изучать C++, он, наконец, нашел язык, на котором можно было создавать общие алгоритмы (например, сортировку STL), которые работают даже лучше, чем, например, qsort из стандартной библиотеки C, благодаря таким функциям C++, как использование встраивания и компиляции. привязка времени вместо указателей на функции. В стандарте он не называется «STL», поскольку он является всего лишь частью стандартной библиотеки, но этот термин по-прежнему широко используется для отличия его от остальной части стандартной библиотеки (потоки ввода/вывода, интернационализация, диагностика, подмножество библиотеки C и т. д.). [82]
Большинство компиляторов C++, и все основные, предоставляют реализацию стандартной библиотеки C++, соответствующую стандартам.
Основные рекомендации по C++
[ редактировать ]Основные рекомендации C++ [83] — это инициатива, возглавляемая Бьярном Страуструпом, изобретателем C++, и Хербом Саттером, организатором и председателем рабочей группы C++ ISO, призванная помочь программистам писать «современный C++», используя лучшие практики для языковых стандартов C++11 и новее. и помочь разработчикам компиляторов и инструментов статической проверки создавать правила для выявления плохих практик программирования.
Основная цель — эффективно и последовательно писать типо- и ресурсобезопасный C++.
Были объявлены основные руководящие принципы [84] во вступительном слове на CPPCon 2015.
Рекомендации сопровождаются Библиотекой поддержки рекомендаций (GSL), [85] библиотека типов и функций, состоящая только из заголовков, для реализации основных рекомендаций и инструментов статической проверки для обеспечения соблюдения правил рекомендаций. [86]
Совместимость
[ редактировать ]Чтобы предоставить производителям компиляторов большую свободу, комитет по стандартизации C++ решил не диктовать реализацию искажения имен , обработки исключений и других функций, специфичных для реализации. Обратной стороной этого решения является то, что ожидается, что объектный код , созданный разными компиляторами , будет несовместим. Однако предпринимаются попытки стандартизировать компиляторы для конкретных машин или операционных систем . Например, ABI Itanium C++ не зависит от процессора (несмотря на свое название) и реализуется GCC и Clang. [87]
С С
[ редактировать ]C++ часто считают расширенной версией C , но это не совсем так. [88] Большую часть кода C можно легко правильно скомпилировать в C++, но есть несколько отличий, из-за которых некоторый допустимый код C становится недействительным или ведет себя по-другому в C++. Например, C допускает неявное преобразование из void*
на другие типы указателей, но C++ этого не делает (по соображениям безопасности типов). Кроме того, в C++ определено множество новых ключевых слов, например new
и class
, которые могут использоваться в качестве идентификаторов (например, имен переменных) в программе C.
Некоторые несовместимости были устранены в версии стандарта C 1999 года ( C99 ), которая теперь поддерживает такие функции C++, как комментарии к строкам ( //
) и объявления, смешанные с кодом. С другой стороны, C99 представил ряд новых функций, которые не поддерживал C++ и которые были несовместимы или избыточны в C++, такие как массивы переменной длины , собственные типы комплексных чисел (однако std::complex
класс в стандартной библиотеке C++ обеспечивает аналогичную функциональность, хотя и несовместим с кодом), назначенные инициализаторы, составные литералы и restrict
ключевое слово. [89] Некоторые из функций, представленных в C99, были включены в последующую версию стандарта C++, C++11 (из тех, которые не были избыточными). [90] [91] [92] Однако стандарт C++11 вводит новые несовместимости, такие как запрет присвоения строкового литерала указателю на символ, который остается действительным C.
Чтобы смешать код C и C++, любое объявление или определение функции, которая должна вызываться/использоваться как в C, так и в C++, должно быть объявлено с помощью связи C, помещая ее внутри extern "C" {/*...*/}
блокировать. Такая функция не может полагаться на функции, зависящие от искажения имени (т. е. перегрузки функции).
Критика
[ редактировать ]Несмотря на широкое распространение, некоторые известные программисты критиковали язык C++, в том числе Линус Торвальдс . [93] Ричард Столлман , [94] Джошуа Блох , Кен Томпсон , [95] [96] [97] и Дональд Кнут . [98] [99]
Одним из наиболее часто критикуемых моментов C++ является его воспринимаемая сложность как языка, при этом критика заключается в том, что большое количество неортогональных функций на практике требует ограничения кода подмножеством C++, избегая тем самым преимуществ удобочитаемости, присущих общему стилю и идиомам. . Как выразился Джошуа Блох :
Я думаю, что C++ вышел далеко за пределы своей сложности, и тем не менее, его программируют многие люди. Но что вы делаете, так это заставляете людей подбирать его. Поэтому почти каждый известный мне магазин, использующий C++, говорит: «Да, мы используем C++, но мы не используем наследование с множественной реализацией и не используем перегрузку операторов». Есть просто куча функций, которые вы не собираетесь использовать, поскольку сложность получаемого кода слишком высока. И я не думаю, что это хорошо, когда тебе приходится начинать это делать. Вы теряете эту переносимость программиста, когда каждый может читать код другого, и это, я думаю, очень хорошо.
Дональд Кнут (1993, комментируя предварительно стандартизированный C++), который сказал об Эдсгере Дейкстре , что «думать о программировании на C++» «сделало бы его физически больным»: [98] [99]
Проблема, с которой я столкнулся сегодня, заключается в том, что... C++ слишком сложен. На данный момент я не могу написать переносимый код, который, по моему мнению, будет работать на множестве различных систем, если только я не избегаю всех экзотических функций. Всякий раз, когда у разработчиков языка C++ возникало две конкурирующие идеи относительно того, как им следует решить какую-то проблему, они говорили: «Хорошо, мы сделаем их обе». Так что язык, на мой вкус, слишком причудливый.
Кен Томпсон , который был коллегой Страуструпа в Bell Labs, дает свою оценку: [96] [97]
Конечно, здесь есть свои хорошие стороны. Но в целом я считаю, что это плохой язык. Многие вещи он делает наполовину хорошо, и это просто куча взаимоисключающих идей. Все, кого я знаю, будь то личные или корпоративные люди, выбирают подмножество, и эти подмножества различны. Так что это не лучший язык для передачи алгоритма — сказать: «Я написал это, вот, возьми». Он слишком большой и слишком сложный. И очевидно, что он создан комитетом . Страуструп в течение многих лет вел кампанию, выходящую за рамки любого технического вклада, который он внес в язык, за его принятие и использование. И он как бы руководил всеми комитетами по стандартам с помощью кнута и стула. И он никому не сказал «нет». Он вложил в этот язык все, что когда-либо существовало. Он не был четко спроектирован — это был просто союз всего, что произошло. И я думаю, что это сильно пострадало от этого.
Однако Брайан Керниган , также коллега из Bell Labs, оспаривает эту оценку: [100]
C++ оказал огромное влияние. ... Многие люди говорят, что C++ слишком большой и слишком сложный и т. д. и т. п., но на самом деле это очень мощный язык, и почти все, что там есть, существует по очень серьезной причине: это не кто-то случайно изобретает. На самом деле это люди, пытающиеся решить проблемы реального мира. Многие программы, которые мы сегодня считаем само собой разумеющимися и которые мы просто используем, — это программы на C++.
Сам Страуструп отмечает, что семантика C++ гораздо чище, чем его синтаксис: «внутри C++ существует гораздо меньший и более чистый язык, изо всех сил пытающийся выбраться наружу». [101]
Другие жалобы могут включать отсутствие отражения или сборки мусора , длительное время компиляции, заметное замедление функций , [102] и подробные сообщения об ошибках, особенно в результате метапрограммирования шаблонов. [103]
См. также
[ редактировать ]- Carbon (язык программирования)
- Сравнение языков программирования
- Список компиляторов C++
- Краткое описание C++
- Категория:Библиотеки C++
Сноски
[ редактировать ]- ^ За идею бесстековых сопрограмм C++20.
- ^ Этот код скопирован непосредственно со страницы исправлений Бьярна Страуструпа (стр. 633). Он обращается к использованию
'\n'
скорее, чемstd::endl
. Также см. Могу ли я написать «void main()»? Архивировано 2 июля 2020 года на Wayback Machine для объяснения неявногоreturn 0;
вmain
функция. Этот неявный возврат недоступен в других функциях.
Ссылки
[ редактировать ]- ^ «Обзор модулей C++» . Майкрософт. 24 апреля 2023 г.
- ^ Jump up to: а б с д и ж Страуструп, Бьярн (1996). «История C++: 1979-1991». История языков программирования---II . АКМ . стр. 699–769. дои : 10.1145/234286.1057836 .
- ^ Страуструп, Бьярне (16 декабря 2021 г.). «C++20: достижение целей C++ — Бьерн Страуструп — CppCon 2021» . CppCon. Архивировано из оригинала 30 декабря 2021 года . Проверено 30 декабря 2021 г.
- ^ Страуструп, Бьярне (12 июня 2020 г.). «Процветание в многолюдном и меняющемся мире: C++ 2006–2020» . Труды ACM по языкам программирования . 4 (ХОПЛ). Ассоциация вычислительной техники (ACM): 1–168. дои : 10.1145/3386320 . ISSN 2475-1421 . S2CID 219603741 .
- ^ Науглер, Дэвид (май 2007 г.). «C# 2.0 для программиста C++ и Java: семинар-конференция». Журнал компьютерных наук в колледжах . 22 (5).
Хотя C# находился под сильным влиянием Java, на него также сильно повлиял C++, и его лучше всего рассматривать как потомка C++ и Java.
- ^ «Спецификация часовни (Благодарность)» (PDF) . Cray Inc., 1 октября 2015 г. Архивировано (PDF) из оригинала 24 июня 2018 г. . Проверено 14 января 2016 г.
- ^ Фогс, Майкл. «Вопросы и ответы Рича Хики» . Кодекс Ежеквартально . Архивировано из оригинала 11 января 2017 года . Проверено 11 января 2017 г.
- ^ Гарри. Х. Чаудхари (28 июля 2014 г.). «Интервью по программированию на Java :: 2000+ вопросов и ответов на интервью по Java» . Архивировано из оригинала 27 мая 2021 года . Проверено 29 мая 2016 г.
- ^ Роджер Пун (1 мая 2017 г.). «Масштабирование JS++: абстракция, производительность и читаемость» . Архивировано из оригинала 11 мая 2020 года . Проверено 21 апреля 2020 г.
- ^ «Эволюция языка расширения: история Lua» . www.lua.org . Проверено 4 января 2023 г.
- ^ «Часто задаваемые вопросы по языку программирования Nim» . Архивировано из оригинала 11 июля 2017 года . Проверено 21 апреля 2020 г.
- ^ «9. Классы — документация Python 3.6.4» . docs.python.org . Архивировано из оригинала 23 октября 2012 года . Проверено 9 января 2018 г.
- ^ «Влияния — Справочник по ржавчине» . doc.rust-lang.org . Проверено 4 января 2023 г.
- ^ Страуструп, Бьярн (1997). «1». Язык программирования C ++ (Третье изд.). Аддисон-Уэсли. ISBN 0-201-88954-4 . OCLC 59193992 .
- ^ Jump up to: а б с Страуструп, Б. (6 мая 2014 г.). «Лекция: Сущность C++. Эдинбургский университет» . Ютуб . Архивировано из оригинала 28 апреля 2015 года . Проверено 12 июня 2015 г.
- ^ Страуструп, Бьярне (17 февраля 2014 г.). «Приложения C++» . stroustrup.com . Архивировано из оригинала 4 апреля 2021 года . Проверено 5 мая 2014 г.
- ^ Jump up to: а б «ИСО/МЭК 14882:2020» . Международная организация по стандартизации. Архивировано из оригинала 16 декабря 2020 года . Проверено 16 декабря 2020 г.
- ^ «Домашняя страница Бьярна Страуструпа» . www.stroustrup.com . Архивировано из оригинала 14 мая 2019 года . Проверено 15 мая 2013 г.
- ^ «Расписание C++ IS» (PDF) . Архивировано (PDF) из оригинала 10 августа 2020 г. Проверено 9 августа 2020 г.
- ^ «C++; куда движется» . Архивировано из оригинала 3 декабря 2018 года . Проверено 3 декабря 2018 г.
- ^ Jump up to: а б Страуструп, Бьярне (7 марта 2010 г.). «Часто задаваемые вопросы Бьярна Страуструпа: когда был изобретен C++?» . stroustrup.com . Архивировано из оригинала 6 февраля 2016 года . Проверено 16 сентября 2010 г.
- ^ Jump up to: а б Страуструп, Бьерн. «Развитие языка в реальном мире и для него: C++ 1991–2006» (PDF) . Архивировано (PDF) из оригинала 20 ноября 2007 г. Проверено 14 августа 2013 г.
- ^ Jump up to: а б с Страуструп, Бьерн. «История C++: 1979−1991» (PDF) . Архивировано (PDF) из оригинала 2 февраля 2019 года . Проверено 18 июля 2013 г.
- ^ Страуструп, Бьерн. «Язык программирования C ++» (первое изд.). Архивировано из оригинала 9 августа 2012 года . Проверено 16 сентября 2010 г.
- ^ Страуструп, Бьерн. «Язык программирования C ++» (второе изд.). Архивировано из оригинала 9 августа 2012 года . Проверено 16 сентября 2010 г.
- ^ Саттер, Херб (30 июня 2016 г.). «Отчет о поездке: Летняя встреча по стандартам ISO C++ (Оулу)» . Hersutter.com . Архивировано из оригинала 8 октября 2016 года.
Следующим стандартом после C++17 будет C++20.
- ^ Душикова, Хана (6 ноября 2019 г.). «N4817: Приглашение и информация о встрече в Праге 2020 года» (PDF) . Архивировано (PDF) из оригинала 29 декабря 2019 года . Проверено 13 февраля 2020 г. .
- ^ «Текущее состояние» . isocpp.org . Архивировано из оригинала 8 сентября 2020 года . Проверено 7 сентября 2020 г.
- ^ «Одобрено C++20 — Херб Саттер» . isocpp.org . Архивировано из оригинала 11 сентября 2020 года . Проверено 8 сентября 2020 г.
- ^ «Пионер компьютерных наук Бьерн Страуструп получит премию Чарльза Старка Дрейпера в области инженерии 2018 года» (пресс-релиз). Национальная инженерная академия. 3 января 2018 г. Архивировано из оригинала 3 января 2018 г. Проверено 14 декабря 2021 г.
- ^ ТИОБЕ (январь 2022 г.). «Индекс ТИОБЕ за январь 2021 года» . TIOBE.com . Компания ТИОБЕ. Архивировано из оригинала 25 февраля 2018 года . Проверено 2 февраля 2022 г.
- ^ «Часто задаваемые вопросы Бьярна Страуструпа – откуда взялось название «C++»?» . Архивировано из оригинала 6 февраля 2016 года . Проверено 16 января 2008 г.
- ^ «C для программистов C++» . Северо-Восточный университет . Архивировано из оригинала 17 ноября 2010 года . Проверено 7 сентября 2015 г.
- ^ «ИСО/МЭК 14882:1998» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2017 года . Проверено 23 ноября 2018 г.
- ^ «ИСО/МЭК 14882:2003» . Международная организация по стандартизации. Архивировано из оригинала 13 августа 2021 года . Проверено 23 ноября 2018 г.
- ^ Jump up to: а б «ИСО/МЭК 14882:2011» . Международная организация по стандартизации. Архивировано из оригинала 27 мая 2016 года . Проверено 23 ноября 2018 г.
- ^ «ИСО/МЭК 14882:2014» . Международная организация по стандартизации. Архивировано из оригинала 29 апреля 2016 года . Проверено 23 ноября 2018 г.
- ^ «ИСО/МЭК 14882:2017» . Международная организация по стандартизации. Архивировано из оригинала 29 января 2013 года . Проверено 2 декабря 2017 г.
- ^ «У нас есть международный стандарт: C++0x одобрен единогласно» . Мельница Саттера . 12 августа 2011 года. Архивировано из оригинала 28 июня 2018 года . Проверено 23 ноября 2018 г.
- ^ «Будущее C++» . Архивировано из оригинала 23 октября 2018 года . Проверено 23 ноября 2018 г. - через канал 9.msdn.com.
- ^ «У нас есть C++14!: Стандартный C++» . isocpp.org . Архивировано из оригинала 19 августа 2014 года . Проверено 19 августа 2014 г.
- ^ Саттер, Херб (15 июля 2017 г.). «Отчет о поездке: Летняя встреча по стандартам ISO C++ (Торонто)» . Архивировано из оригинала 6 августа 2017 года . Проверено 4 августа 2017 г.
- ^ «ИСО/МЭК ТР 18015:2006» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТР 19768:2007» . Международная организация по стандартизации. Архивировано из оригинала 4 марта 2016 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТР 29124:2010» . Международная организация по стандартизации. Архивировано из оригинала 12 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТР 24733:2011» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 18822:2015» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 19570:2015» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 19841:2015» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 19568:2015» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 19217:2015» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 19571:2016» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 19568:2017» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 21425:2017» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 22277:2017» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 19216:2018» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 21544:2018» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 19570:2018» . Международная организация по стандартизации. Архивировано из оригинала 15 января 2019 года . Проверено 15 февраля 2019 г.
- ^ «ИСО/МЭК ТС 23619:2021» . Международная организация по стандартизации. Архивировано из оригинала 15 декабря 2018 года . Проверено 11 октября 2021 г.
- ^ Б. Страуструп (интервью Серджио Де Симоне) (30 апреля 2015 г.). «Страуструп: Мысли о C++17 — Интервью» . Архивировано из оригинала 8 июля 2015 года . Проверено 8 июля 2015 г.
- ^ Страуструп, Бьярне (2000). Язык программирования C++ (Специальное изд.). Аддисон-Уэсли. п. 46. ИСБН 0-201-70073-5 .
- ^ Страуструп, Бьерн. «Открытые вопросы по языку программирования C++ (3-е издание)» . Архивировано из оригинала 5 мая 2014 года . Проверено 5 мая 2014 г.
- ^ ИСО / МЭК . Языки программирования — черновик C++11 (n3797). Архивировано 2 октября 2018 г. в Wayback Machine §3.7 Продолжительность хранения [basic.stc]
- ^ ИСО / МЭК . Языки программирования — черновик C++11 (n3797). Архивировано 2 октября 2018 г. в Wayback Machine §3.7.1 Продолжительность статического хранения [basic.stc.static]
- ^ ИСО / МЭК . Языки программирования — черновик C++11 (n3797). Архивировано 2 октября 2018 г. в Wayback Machine §3.7.2 Продолжительность хранения потока [basic.stc.thread]
- ^ ИСО / МЭК . Языки программирования — черновик C++11 (n3797). Архивировано 2 октября 2018 г. в Wayback Machine §3.7.3 Продолжительность автоматического хранения [basic.stc.auto]
- ^ ИСО / МЭК . Языки программирования — черновик C++11 (n3797). Архивировано 2 октября 2018 г. в Wayback Machine §3.7.4 Продолжительность динамического хранения [basic.stc.dynamic]
- ^ «Основные рекомендации по C++» . isocpp.github.io . Архивировано из оригинала 8 февраля 2020 года . Проверено 9 февраля 2020 г.
- ^ Jump up to: а б «Никто не понимает C++: Часть 5: Раздувание шаблонного кода» . Articles.emptycrate.com/: Программное обеспечение EmptyCrate. Путешествовать. Вещи. 6 мая 2008 г. Архивировано из оригинала 25 апреля 2016 г. . Проверено 8 марта 2010 г.
Иногда вы будете читать или слышать, как кто-то говорит о шаблонах C++, вызывающих раздувание кода. Я думал об этом на днях и подумал про себя: «Я сам, если код делает то же самое, то скомпилированный код не может быть больше, не так ли?» [...] А как насчет размера скомпилированного кода? Каждый из них был скомпилирован с помощью команды g++ <имя_файла>.cpp -O3. Нешаблонная версия: 8140 байт, шаблонная версия: 8028 байт!
- ^ Саттер, Херб ; Александреску, Андрей (2004). Стандарты кодирования на C++: 101 правило, рекомендации и передовой опыт . Аддисон-Уэсли.
- ^ Хенриксон, Матс; Найквист, Эрик (1997). Промышленная мощь C++ . Прентис Холл. ISBN 0-13-120965-5 .
- ^ Страуструп, Бьярне (2000). Язык программирования C++ (Специальное изд.). Аддисон-Уэсли. п. 310. ИСБН 0-201-70073-5 .
Виртуальную функцию-член иногда называют методом .
- ^ Майкрофт, Алан (2013). «Исключения C и C++ | Шаблоны» (PDF) . Кембриджская компьютерная лаборатория — Материалы курса 2013–2014 гг . Архивировано (PDF) из оригинала 13 мая 2016 года . Проверено 30 августа 2016 г.
- ^ Страуструп, Бьярне (2013). Язык программирования C++ . Эддисон Уэсли. п. 345. ИСБН 9780321563842 .
- ^ Страуструп, Бьярне (2013). Язык программирования C++ . Эддисон Уэсли. стр. 363–365. ISBN 9780321563842 .
- ^ Страуструп, Бьярне (2013). Язык программирования C++ . Эддисон Уэсли. стр. 345, 363. ISBN. 9780321563842 .
- ^ «Руководство по стилю Google C++» . Архивировано из оригинала 16 марта 2019 года . Проверено 25 июня 2019 г.
- ^ «Стандарты кодирования LLVM» . Документация LLVM 9 . Архивировано из оригинала 27 июня 2019 года . Проверено 25 июня 2019 г.
- ^ «Соглашения о кодировании» . Qt Вики . Архивировано из оригинала 26 июня 2019 года . Проверено 26 июня 2019 г.
- ^ Страуструп, Бьярне (2013). Язык программирования C++ . Эддисон Уэсли. стр. 344, 370. ISBN. 9780321563842 .
- ^ Страуструп, Бьярне (2013). Язык программирования C++ . Эддисон Уэсли. п. 349. ИСБН 9780321563842 .
- ^ Грациано Ло Руссо (2008). «Интервью с А. Степановым» . stlport.org . Архивировано из оригинала 4 марта 2009 года . Проверено 8 октября 2015 г.
- ^ «Основные рекомендации по C++» . isocpp.github.io . Архивировано из оригинала 16 февраля 2020 года . Проверено 9 февраля 2020 г.
- ^ «Бьерн Страуструп объявляет основные рекомендации по C++: стандарт C++» . isocpp.org . Архивировано из оригинала 11 мая 2020 года . Проверено 31 марта 2020 г.
- ^ «Майкрософт/ГСЛ» . 18 июля 2021 года. Архивировано из оригинала 18 июля 2021 года . Проверено 18 июля 2021 г. - через GitHub.
- ^ «Использование средств проверки C++ Core Guidelines» . Microsoft Learn . Архивировано из оригинала 13 августа 2021 года . Проверено 31 марта 2020 г.
- ^ «Сводка C++ ABI» . 20 марта 2001 г. Архивировано из оригинала 10 июля 2018 г. Проверено 30 мая 2006 г.
- ^ «Часто задаваемые вопросы Бьярна Страуструпа: является ли C подмножеством C++?» . Архивировано из оригинала 6 февраля 2016 года . Проверено 5 мая 2014 г.
- ^ «C9X — новый стандарт C» . Архивировано из оригинала 21 июня 2018 года . Проверено 27 декабря 2008 г.
- ^ «Поддержка C++0x в GCC» . Архивировано из оригинала 21 июля 2010 года . Проверено 12 октября 2010 г.
- ^ «Основные возможности языка C++0x в VC10: таблица» . Архивировано из оригинала 21 августа 2010 года . Проверено 12 октября 2010 г.
- ^ «Clang — статус C++98, C++11 и C++14» . Clang.llvm.org. 12 мая 2013 года. Архивировано из оригинала 4 июля 2013 года . Проверено 10 июня 2013 г.
- ^ «Re: [RFC] Преобразование builin-mailinfo.c для использования The Better String Library» (список рассылки). 6 сентября 2007 г. Архивировано из оригинала 8 марта 2021 г. Проверено 31 марта 2015 г.
- ^ «Re: Усилия по привлечению большего количества пользователей?» (Список рассылки). 12 июля 2010 г. Архивировано из оригинала 21 марта 2015 г. . Проверено 31 марта 2015 г.
- ^ Эндрю Бинсток (18 мая 2011 г.). «Доктор Добб: Интервью с Кеном Томпсоном» . Архивировано из оригинала 13 марта 2014 года . Проверено 7 февраля 2014 г.
- ^ Jump up to: а б Питер Сейбел (16 сентября 2009 г.). Программисты за работой: размышления о ремесле программирования . Апресс. стр. 475–476. ISBN 978-1-4302-1948-4 . Архивировано из оригинала 1 декабря 2019 года . Проверено 9 ноября 2017 г.
- ^ Jump up to: а б «C++ в работе программистов» . 16 октября 2009 г. Архивировано из оригинала 10 ноября 2017 г. Проверено 9 ноября 2017 г.
- ^ Jump up to: а б «Интервью с Дональдом Кнутом» . Доктор Добб . Архивировано из оригинала 8 марта 2021 года . Проверено 18 июля 2021 г.
- ^ Jump up to: а б «(La)TeX Навигатор» . Архивировано из оригинала 20 ноября 2017 года . Проверено 10 ноября 2017 г. .
- ^ Брайан Керниган (18 июля 2018 г.). Брайан Керниган: вопросы и ответы — Компьютерфил . Архивировано из оригинала 25 сентября 2021 года.
- ^ «Страуструп: Часто задаваемые вопросы» . www.stroustrup.com . Архивировано из оригинала 6 февраля 2016 года . Проверено 7 июня 2013 г.
- ^ Пайк, Роб (2012). «Меньше значит экспоненциально больше» . Архивировано из оригинала 7 июля 2017 года . Проверено 23 ноября 2018 г.
- ^ Крейнин, Йоси (13 октября 2009 г.). «Дефектный C++» . Архивировано из оригинала 5 февраля 2016 года . Проверено 3 февраля 2016 г.
Дальнейшее чтение
[ редактировать ]- Абрахамс, Дэвид ; Гуртовой, Алексей (2005). Метапрограммирование шаблонов C++: концепции, инструменты и методы из Boost и за его пределами . Аддисон-Уэсли. ISBN 0-321-22725-5 .
- Александреску, Андрей (2001). Современный дизайн на C++: применение общих шаблонов программирования и проектирования . Аддисон-Уэсли. ISBN 0-201-70431-5 .
- Александреску, Андрей ; Саттер, Херб (2004). Стандарты проектирования и кодирования C++: правила и рекомендации по написанию программ . Аддисон-Уэсли. ISBN 0-321-11358-6 .
- Беккер, Пит (2006). Расширения стандартной библиотеки C++: Учебное пособие и справочник . Аддисон-Уэсли. ISBN 0-321-41299-0 .
- Чанкс, Фрэнк (2010). Аннотации С++ . Университет Гронингена. ISBN 978-90-367-0470-0 . Архивировано из оригинала 28 апреля 2010 года . Проверено 28 апреля 2010 г.
- Коплиен, Джеймс О. (1994) [перепечатано с исправлениями, исходный год публикации - 1992]. Продвинутый C++: стили и идиомы программирования . Аддисон-Уэсли. ISBN 0-201-54855-0 .
- Дьюхерст, Стивен К. (2005). Общие знания C++: основы программирования среднего уровня . Аддисон-Уэсли. ISBN 0-321-32192-8 .
- Совет индустрии информационных технологий (15 октября 2003 г.). Языки программирования – C++ (Второе изд.). Женева: ИСО/МЭК. 14882:2003(Е).
- Джосуттис, Николай М. (2012). Стандартная библиотека C++, учебное пособие и справочник (второе изд.). Аддисон-Уэсли. ISBN 978-0-321-62321-8 .
- Кениг, Эндрю ; Му, Барбара Э. (2000). Ускоренный C++ — Практическое программирование на примерах . Аддисон-Уэсли. ISBN 0-201-70353-Х .
- Липпман, Стэнли Б .; Лажуа, Жозеф; Му, Барбара Э. (2011). C++ Primer (Пятое изд.). Аддисон-Уэсли. ISBN 978-0-321-71411-4 .
- Липпман, Стэнли Б. (1996). Внутри объектной модели C++ . Аддисон-Уэсли. ISBN 0-201-83454-5 .
- Мейерс, Скотт (2005). Эффективный C++ (Третье изд.). Аддисон-Уэсли. ISBN 0-321-33487-6 .
- Страуструп, Бьярне (2013). Язык программирования C ++ (Четвертое изд.). Аддисон-Уэсли. ISBN 978-0-321-56384-2 .
- Страуструп, Бьярн (1994). Проектирование и эволюция C++ . Аддисон-Уэсли. ISBN 0-201-54330-3 .
- Страуструп, Бьярне (2014). Программирование: принципы и практика использования C ++ (второе изд.). Аддисон-Уэсли. ISBN 978-0-321-99278-9 .
- Саттер, Херб (2001). Еще больше выдающихся C++: 40 новых инженерных головоломок, проблем программирования и решений . Аддисон-Уэсли. ISBN 0-201-70434-Х .
- Саттер, Херб (2004). Исключительный стиль C++ . Аддисон-Уэсли. ISBN 0-201-76042-8 .
- Вандевурде, Дэвид; Джосуттис, Николай М. (2003). Шаблоны C++: полное руководство . Аддисон-Уэсли. ISBN 0-201-73484-2 .
Внешние ссылки
[ редактировать ]- JTC1/SC22/WG21 – рабочая группа по стандарту ISO/IEC C++.
- Standard C++ Foundation — некоммерческая организация, которая способствует использованию и пониманию стандарта C++. Бьёрн Страуструп — директор организации.
- С++
- Семейство языков программирования Алгол
- Семейство языков программирования C++
- Языки программирования на основе классов
- Кроссплатформенное программное обеспечение
- Языки программирования высокого уровня
- Объектно-ориентированные языки программирования
- Языки программирования, созданные в 1983 году.
- Языки программирования со стандартом ISO
- Статически типизированные языки программирования
- Скомпилированные языки программирования