Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
37
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

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.

Данные, переменные и вычисления 99

Поскольку имена фундаментальных типов ISO/ANSI С++ служат псевдонимами для имен классов в программе С++/СЫ, в принципе вы можете использовать в коде C++/CLI и те, и другие. Например, вы уже знаете, как записывать операторы, создаю- щие целые переменные и переменные с плавающей точкой:

Вы можете использовать имена классов, соответствующие фундаментальным ти- пам, и компилировать программу без каких-либо проблем:

Хотя это совершенно законно, все же в своем коде вы должны использовать име- на фундаментальных типов, такие как 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. срр следующим об- разом:

Данные, переменные и вычисления 102

Новые строки выделены полужирным, и они заменяют две автоматически сгене- рированные строки в 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 (), когда нужно вывести два или более элемента данных в одну строку несколькими отдельными операторами.

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