Статьи

С ++ Кратко: Введение

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

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

Я приложил все усилия, чтобы быть максимально точным, не звуча как языковая спецификация или файл документации. Я надеюсь, что мне это удалось. Во время написания этой статьи я часто обращался к спецификации языка C ++ 11, а также читал все, от публикаций StackOverflow, до документов MSDN, до документов GCC и других. Есть области, где я намеренно упростил вещи. Продолжая расширять свои знания C ++, вы, несомненно, столкнетесь с проблемами, когда вам нужно иметь более полное понимание, чтобы достичь своей цели или устранить ошибку. Если чтение этой книги даст достаточно знаний — и достаточно хорошего понимания языка, на котором вы сможете распознать, диагностировать и решить эти проблемы — тогда я буду доволен, что достиг своих целей. Добро пожаловать в C ++!


Будучи юристом в отставке, я чувствую себя обязанным включить этот краткий раздел, который, вероятно, вас не волнует, если вы не юрист одной из этих компаний или организаций. Остальная часть этого предисловия гораздо приятнее читать для не юристов, поэтому, пожалуйста, не позволяйте этому оттолкнуть вас. Microsoft®, Visual Studio®, Visual C ++®, Visual C #®, Windows®, Windows NT®, Win32®, MSDN®, Silverlight®, DirectX® и IntelliSense® являются зарегистрированными товарными знаками корпорации Microsoft. GNU® является зарегистрированным товарным знаком Фонда свободного программного обеспечения. ISO® является зарегистрированным знаком обслуживания Международной организации по стандартизации. IEC® является зарегистрированным знаком обслуживания Международного инженерного консорциума, Inc. Unicode® является зарегистрированным знаком обслуживания Unicode, Inc. (он же Консорциум Unicode). Intel® является зарегистрированным товарным знаком корпорации Intel. Другие товарные знаки и знаки обслуживания являются собственностью соответствующих владельцев.


В C # точкой входа для программы является статический метод с именем Main . Часто вы этого не увидите, поскольку различные фреймворки предоставляют свои собственные (например, Silverlight), но он где-то есть, поскольку без него операционная система не будет знать, с чего начать выполнение вашей программы.

Точка входа в программу на C ++ является main функцией. Простая версия выглядит так:

1
2
3
4
5
6
7
int main(int argc, char* argv[])
{
    // Your program starts here.
 
    // Returning 0 signifies success.
    return 0;
}

Параметры — это число аргументов, за которым следует массив аргументов командной строки (в виде строк). В программировании Windows вы часто будете видеть это как точку входа:

1
2
3
4
5
6
7
int wmain(int argc, wchar_t* argv[])
{
    // Your program starts here.
 
    // Returning 0 signifies success.
    return 0;
}

Эта wmain входа wmain зависит от Microsoft. Он используется в качестве точки входа для программ Windows Unicode (в отличие от старых программ ASCII / кодовых страниц). Операционные системы Microsoft, поддерживающие Unicode (все, начиная с Windows 2000 и Windows NT 4 и даже систем на основе Win 9X при установке специального дополнения), используют кодировку UTF-16. Таким образом, вы действительно должны всегда использовать Unicode при написании своих программ, если вам абсолютно не требуется поддержка старых систем, которые не поддерживают Unicode.

Вы также часто будете видеть это как точку входа для программ Windows:

1
2
3
4
5
6
7
8
9
#include <tchar.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    // Your program starts here.
 
    // Returning 0 signifies success.
    return 0;
}

Windows SDK предоставляет файл заголовка tchar.h , который вы можете (и должны) использовать, когда вам нужно создать проект, который будет использоваться как в Unicode, так и в не-Unicode-версиях Windows. Я не использую его в образцах, потому что, насколько это возможно, я хотел сделать образцы переносимыми и соответствующими стандартам.

Вместо этого я написал небольшой заголовочный файл pchar.h , который упрощает проблему переносимости точки входа. Это не решает большинство проблем переносимости, возникающих при работе со строками; К сожалению, переносимость строк — это та область, которая просто не проста в C ++. Действительно, мой заголовочный файл здесь не является хорошим примером того, что нужно делать, когда вам действительно нужны аргументы командной строки. Мы обсудим строки более подробно позже в книге. А сейчас, во-первых, вот заголовочный файл:

Образец: pchar.h

01
02
03
04
05
06
07
08
09
10
11
12
13
14
#pragma once
 
#if !defined(_PCHAR_H)
#define _PCHAR_H 1
 
#if defined(WIN32) && defined(UNICODE)
#define _pmain wmain
#define _pchar wchar_t
#else
#define _pmain main
#define _pchar char
#endif
 
#endif

Во-вторых, вот как выглядит точка входа (здесь я не включил заголовочный файл):

1
2
3
4
5
6
7
int _pmain(int /*argc*/, _pchar* /*argv*/[])
{
    // Your program starts here.
 
    // Returning 0 signifies success.
    return 0;
}

Как видите, имена параметров закомментированы (используется комментарий в стиле C, т. /*...*/ ). Это совершенно законно в C ++ и это то, что вы должны делать всякий раз, когда у вас есть функция, которая должна иметь определенные параметры, хотя вы не можете использовать эти параметры. Комментируя имена параметров, вы гарантируете, что не будете использовать их случайно.

Код в pchar.h дает нам достаточно переносимую точку входа, а сама точка входа int _pmain(int, _pchar*[]) гарантирует, что мы никогда не будем использовать переданные аргументы командной строки. Если вам когда-либо понадобятся аргументы командной строки, то это решение не будет работать — вам понадобится более сложное и более сложное решение.


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

В качестве примера параметра против аргумента, в C # у вас может быть метод класса, например void AddTwoNumbers(int a, int b, ref int result) { result = a + b; } void AddTwoNumbers(int a, int b, ref int result) { result = a + b; } В этом случае a , b и result являются параметрами; мы знаем, что AddTwoNumbers может изменить значение аргумента, переданного для параметра result (как, впрочем, и так). Если вы назвали этот метод так, int one = 1, two = 2, answer = 0; someClass.AddTwoNumbers(one, two, ref answer); int one = 1, two = 2, answer = 0; someClass.AddTwoNumbers(one, two, ref answer); тогда one , two и answer будут аргументами, передаваемыми в AddTwoNumbers .


Примеры кода в этой книге используют цвета подсветки синтаксиса из Visual Studio 2012 Ultimate RC. Это поможет вам понять код, но вам также будет хорошо читать это на монохромном устройстве для чтения электронных книг.


Примеры в этой книге доступны по адресу https://bitbucket.org/syncfusion/cpp_succinctly .

Образцы для этой книги были разработаны и разработаны с использованием Visual Studio 2012 Ultimate RC. Компилятор C ++, поставляемый с VS 2012, включает новые функции языкового стандарта C ++ 11, которые не были включены в Visual Studio 2010. Осенью 2012 года Microsoft выпустит бесплатную «экспресс-» версию Visual Studio 2012 , которая будет позволяют разработчикам использовать ориентированные на C ++ настольные приложения (такие как консольное приложение, которое используют примеры). До тех пор, чтобы в полной мере использовать примеры, вам потребуется не-Express версия Visual Studio 2012.

Я протестировал множество примеров с использованием Minimalist GNU для Windows (MinGW) , поэтому должно быть много возможностей для кросс-компиляции. Единственный известный мне пример, который не работает так, как написано с помощью компилятора GCC, который предоставляет MinGW, это StorageDurationSample . Он использует специфичное для Microsoft расширение языка _declspec(thread) для моделирования хранилища thread_local . GCC имеет свое собственное очень похожее расширение, и другие поставщики компиляторов, несомненно, тоже так делают, поэтому, если вы замените его соответствующим кодом для компилятора, который вы решите использовать, он должен затем скомпилироваться и запустить.

Наконец, все образцы являются консольными. Я выбрал образцы консоли, чтобы мы могли избежать всего постороннего кода, который приходит с созданием и отображением окон в оконной среде. Чтобы просмотреть выходные данные любого конкретного примера, вы можете либо установить точку останова в операторе return в конце функции _pmain а затем запустить его с помощью отладчика Visual Studio, либо запустить его с помощью команды « Пуск без отладки» в « Отладке». меню в Visual Studio (обычно для этого используется сочетание клавиш Ctrl + F5). Вы также должны убедиться, что проект, который вы хотите запустить, установлен как стартовый проект. Вы можете сделать это, щелкнув правой кнопкой мыши имя проекта в обозревателе решений, а затем щелкнув левой кнопкой мыши на Set as Startup Project в появившемся контекстном меню.


В 2011 году рабочая группа ИСО / МЭК, ответственная за проектирование и разработку C ++ как языка, приняла новую основную версию стандарта языка C ++. По сравнению с C ++ 98 и C ++ 03, C ++ 11 выглядит как другой язык. Поскольку C ++ 11 настолько нов, нет компиляторов, которые поддерживают каждую функцию, и есть некоторые, которые поддерживают меньше, чем другие. Я нацелился на Visual C ++ и функции, которые он реализует в своем последнем выпуске (Visual Studio 2012 RC на момент написания этой статьи), хотя я упомянул несколько функций, которые Visual C ++ в настоящее время не поддерживает, и указал на это, когда это необходимо.

Вряд ли Visual C ++ сильно изменится между Visual Studio 2012 RC и Visual Studio 2012 RTM. Есть планы сделать внешнее обновление, которое добавит дополнительную поддержку языка C ++ 11, спустя некоторое время после выхода RTM. Поскольку я не могу предсказать, какие функции будут добавлены, и не имею никаких внутренних знаний об этом, я в основном не рассматривал вещи, которые не поддерживаются в RC.

Если у вас есть предыдущий опыт работы с C ++ пять лет назад или, возможно, дольше, вы, вероятно, будете очень приятно удивлены, что не означает, что в нем есть все, что есть в C #.

Есть функции C # и .NET, которые мне не хватает при работе в C ++. Но есть и функции C ++, которые мне не хватает при работе в C #. Мне не хватает простоты приведения в C #, которую обеспечивает система типов CLR, когда я работаю в C ++. Я также скучаю по более полному набору исключений .NET и часто лучшему IntelliSense, который предоставляет .NET. В C ++ я гораздо больше обращаюсь к документации, чем в C #, чтобы выяснить, например, какие значения аргументов я могу и должен передать конкретной функции, и какие значения следует ожидать от нее.

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

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

Этот урок представляет собой главу из C ++ Succinctly , бесплатной книги от команды Syncfusion .