Информация
Запрошенная вами тема показана ниже. Однако эта тема не включена в библиотеку.

Возвращение к C++ (современный C++)

C++ является одним из наиболее широко используемых языков программирования в мире. Хорошо написанные программы на C++ работают быстро и эффективно. Язык является более гибким, чем другие языки, поскольку его можно использовать для создания широкого спектра приложений - от интересных и ярких игр до высокопроизводительного научного программного обеспечения, до драйверов устройств, встроенных приложений, клиентских программ для Windows. Более 20 лет C++ используется для разрешения этих и многих других задач. Всё больше увеличивается число программистов на C++, которые отказываются от неряшливого программирования в стиле C вчерашнего дня и принимают современный стиль программирования С++ вместо него.

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

Современный C++ делает особые акценты:

  • Область стека вместо кучи или статической глобальной области.

  • Автоматическое определение типа вместо явного указания типа.

  • Интеллектуальные указатели вместо необработанных указателей.

  • Типы std::string и std::wstring (см. <string>) вместо необработанных массивов char[].

  • Контейнеры STL (Библиотека стандартных шаблонов) такие, как vector, list и map вместо необработанных массивов или пользовательских контейнеров. См. <vector>, <list> и <map>.

  • Алгоритмы STL вместо алгоритмов, закодированных вручную.

  • Исключения - для обработки сбойных ситуаций и уведомления о них.

  • Свободное от блокировок взаимодействие между потоками с помощью STL std::atomic<> (см. <atomic>) вместо других механизмов взаимодействия между потоками.

  • Встроенные лямбда-функции вместо небольших функций, реализованных отдельно.

  • Циклы for, основанные на диапазонах, чтобы создавать циклы, более устойчивые к ошибкам, которые работают с массивами, контейнерами STL и коллекциями среды выполнения Windows в форме for (for-range-declaration :expression ). Это часть базовой языковой поддержки. Для получения дополнительной информации см. Основанное на диапазоне выражение for (C++).

Сам язык C++ также эволюционировал. Сравните следующие фрагменты кода. Здесь показано, как в C++ программировали раньше:


// circle and shape are user-defined types
circle* p = new circle( 42 ); 
vector<shape*> v = load_shapes();

for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) {
    if( *i && **i == *p )
        cout << **i << “ is a match\n”;
}

for( vector<circle*>::iterator i = v.begin();
        i != v.end(); ++i ) {
    delete *i; // not exception safe
}

delete p;

Вот как то же самое выполняется в современном C++


#include <memory>
#include <vector>
// ...
// circle and shape are user-defined types
auto p = make_shared<circle>( 42 );
vector<shared_ptr<shape>> v = load_shapes();

for_each( begin(v), end(v), [&]( const shared_ptr<shape>& s ) {
    if( s && *s == *p )
        cout << *s << " is a match\n";
} );

В современном C++ нет необходимости использовать new/delete или явную обработку исключений, поскольку, вместо этого, можно использовать интеллектуальные указатели.
При использовании auto-переменных и Функция lambda, можно написать код быстрее, более сжато, и сделать его более читаемым. Цикл for_each является более простым, и более устойчивым к непреднамеренным ошибкам , чем цикл for. Можно использовать шаблон с добавлением минимального количества строк кода для создания приложения. Также можно создавать код безопасный в плане исключений и корректно работающий с памятью и, при этом, не имеющий дела с выделением/освобождением памяти и обработкой кодов ошибок.

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

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

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

Не только язык современен, современны и средства разработки. Visual Studio делает все части цикла разработки надёжными и эффективными. Он включает средства управления жизненным циклом приложения (ALM), усовершенствования интегрированной среды разработки, такие как IntelliSense, совместимые со средствами механизмы, такие как XAML, а также сборки, отладки и многие другие средства.

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

Подробнее см. в следующей статье на сайте StackOverflow: Какие идиомы C++ не рекомендуется использовать в C++11

Добавления сообщества

Показ:
© 2014 Microsoft