![](/user_photo/2706_HbeT2.jpg)
- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
98 Глава 2
Специфика C++/CLI: фундаментальные типы данных
Вы можете и должны использовать имена фундаментальных типов ISO/ANSI С++ в своих программах C++/CLI, и с арифметическими операциями они работают точно так же, как вы видели в родном С++. Кроме того, в C++/CLI определены два дополни- тельных целочисленных типа, которые описаны в табл. 2.8.
Чтобы специфицировать литералы типа long long, необходимо добавлять LL или 11 к целому значению. Например:
Литерал типа unsigned long long указывается добавлением ULL или ull к целому значению:
Хотя все операции с фундаментальными типами, что вы видели ранее, работают аналогичным образом с C++/CLI, имена фундаментальных типов в программах С++/ CLI имеют другой смысл и предоставляют дополнительные возможности в некото- рых ситуациях. Фундаментальный тип в программе C++/CLI — это класс типа значе- ния, и может вести себя как обычное значение или как объект, если обстоятельства того требуют.
Внутри языка C++/CLI каждый фундаментальный тип ISO/ANSI отображается на класс типа значения, определенный в пространстве имен System. То есть в про- грамме на C++/CLI имена фундаментальных типов являются сокращениями для ас- социированных с ними классовых типов. Это позволяет трактовать значение фунда- ментального типа как просто значение либо, при необходимости, как автоматически преобразованный объект ассоциированного типа класса. Фундаментальные типы, объ- ем занимаемой ими памяти и соответствующие им типы классов показаны в табл. 2.9.
По умолчанию тип char эквивалентен signed char, поэтому ассоциированный с ними класс типа значения — System: : SByte. Обратите внимание, что вы можете из- менить умолчание char на unsigned char, установив опцию компилятора / J, и в этом случае ассоциированным типом класса будет System: :Byte. System — это корневое пространство имен, в котором определены классы типа значения C++/CLI. Существует множество других типов, определенных в пространстве имен System — такие как String — для представления строк, с которым вы познакомитесь в главе 4. C++/CLI также определяет в пространстве имен System класс типа значения System: : Decimal. Переменные этого типа могут содержать десятичные числа с точностью до 28 знаков.
Как я уже говорил, то, что классы типа значений ассоциированы с каждым фун- даментальным типом, добавляет новые возможности для переменных этих типов в С++/CLI. Когда необходимо, компилятор выполняет автоматические преобразования от исходного значения в ассоциированный тип класса и обратно; этот процесс назы- вается упаковкой (boxing) и распаковкой (unboxing) соответственно. Это позволя- ет переменной любого из этих типов вести себя как простое значение либо как объ- ект — в зависимости от обстоятельств. Подробнее о том, когда и как это происходит, вы узнаете в главе 6.
Данные,
переменные
и
вычисления
Вы можете использовать имена классов, соответствующие фундаментальным ти- пам, и компилировать программу без каких-либо проблем:
Хотя это совершенно законно, все же в своем коде вы должны использовать име- на фундаментальных типов, такие как int и double, вместо имен классов System: : Int32 и System: : Double. Причина в том, что отображение имен фундаментальных типов на имена классов и обратно — это функциональность компилятора Visual С++. Другие компиляторы не обязательно реализуют такие преобразования. Имена фунда- ментальных типов фиксированы в стандарте языка C++/CLI, но отображение боль- шинства их на имена классов зависит от реализации. Тип long в Visual С++ 2005 ото- бражается на тип Int32, но вполне возможно, что в какой-то другой реализации он будет отображаться на тип Int 64.
Возможность представления данных фундаментальных типов в виде объектов классов типа значений — важное средство C++/CLI. В ISO/ANSI С++ фундаменталь- ные типы и типы классов совершенно различны, в то время как в C++/CLI все дан- ные сохраняются в виде объектов классов — как классов типов значений, так и клас- сов ссылочных типов. О классах ссылочных типов вы узнаете в главе 7.
Теперь попробуем написать консольную программу CLR.
Практическое занятие
Консольная программа CLR
Создайте новый проект и выберите тип проекта CLR и шаблон CLR Console Application (Консольное приложение CLR). Затем вы можете ввести имя проекта Ех2_12, как показано на рис. 2.13.
Рис. 2.13. Создание консольного приложения CLR
Когда вы щелкнете на кнопке ОК, мастер Application Wizard сгенерирует проект, содержащий следующий код:
Уверен, что вы обратили внимание на то, что находится между скобками вслед за main. Это связано с передачей значений функции main (), когда вы инициируете вы- полнение программы из командной строки, но об этом вы узнаете больше, когда мы обратимся к теме функций. Если вы скомпилируете и запустите проект по умолча- нию, то увидите, что он выдаст в командную строку "Hello World". А теперь преоб- разуем эту программу в CLR-версию примера Ех2_02, чтобы посмотреть, насколько она будет похожа. Чтобы сделать это, модифицируйте код Ех2_12. срр следующим об- разом:
Данные,
переменные
и
вычисления
Новые строки выделены полужирным, и они заменяют две автоматически сгене- рированные строки в main (). Теперь вы можете скомпилировать и запустить проект. Программа должна выдать следующий вывод:
Описание полученных результатов
Единственное
серьезное отличие — способ вывода.
Определения переменных и
вычисления
— те же самые. Хотя вы применяете те же
имена типов, что и в версии
этого
примера ISO/ANSI
С++, это не то же самое. Переменные apples,
oranges
и
fruit
имеют
тип C++/CLI,
который специфицирован как int,
и
они обладают некоторыми дополнительными возможностями по сравнению с типом ISO/ANSI. Здесь переменные в некоторых случаях могут вести себя либо как про- стые значения, либо как объекты. Если вы хотите подтвердить, что в данном случае Int32 — то же самое, что int, то можете заменить имя типа int на Int32 и переком- пилировать пример. Он должен работать точно таким же образом.
Очевидно, что следующая строка кода выдает первую строку вывода:
WriteLine () — это функция C++/CLI, которая определена в классе Console про- странства имен System. Подробнее о классах вы узнаете в главе 6, а пока что скажу, что класс Console предоставляет стандартные потоки ввода и вывода, соответствую- щие клавиатуре и командной строке консольного окна. То есть функция WriteLine () пишет все, что находится между скобками, следующими за ее именем, в командную строку, добавляя при этом символ новой строки, чтобы переместить курсор в начало следующей строки экрана. То есть предыдущий оператор выводит в командную стро- ку текст "ХпАпельсины — не единственные фрукты. . . ". Буква L, предшествующая строке, указывает на то, что это строка, состоящая из "широких" символов, где каж- дый занимает 2 байта.
Функция Write () класса Console — это, по сути, то же самое, что функция WriteLine (), с единственным отличием — она не добавляет к указанному выводу сим- вол новой строки. Поэтому вы можете использовать Write (), когда нужно вывести два или более элемента данных в одну строку несколькими отдельными операторами.
Значение, которые вы помещаете между скобками, следующими за именем функ- ции, называются аргументами. В зависимости от того, как написана функция, она