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

107 Глава 2

Аргумент true функции ReadKey () подавляет отображение нажатой клавиши в командной строке. Аргумент false (или отсутствие аргумента) заставляет функцию отображать символ нажатой клавиши. Результат выполнения функции сохраняется в keyPress. Чтобы идентифицировать символ, соответствующий нажатой клавише (или клавишам), необходимо использовать выражение keyPress .KeyChar. Таким об- разом, чтобы вывести сообщение, показывающее символ нажатой клавиши, нужно воспользоваться следующим оператором:

Нажатая клавиша идентифицируется выражением keyPress .Key. Это выражение ссылается на значение из перечисления C++/CLI (с которым вы вскоре познакоми- тесь), идентифицирующее нажатую клавишу. Об объекте ConsoleKeylnf о можно ска- зать еще много чего. И в этой книге мы еще к нему вернемся.

Хотя то, что в консольных программах C++/CLI нет форматирования ввода, мо- жет показаться неудобным во время изучения, на практике это ограничение не суще- ственно. Почти все реальные программы, которые вам придется писать, принимают ввод через компоненты окна, поэтому обычно нет необходимости читать данные из командной строки.

Применение safe_cast

Операция safecast предназначена для явных приведений типов в среде CLR. В большинстве случаев вы можете без проблем использовать staticcast для приведе- ния одного типа к другому в программах C++/CLI, но поскольку есть исключения, ко- торые приводят к сообщениям об ошибках, лучше все-таки использовать safecast. Приведение saf ecast применяется точно так же, как staticcast. Например:

Последний оператор приводит каждое из значений типа double к типу int перед тем, как сложить их и присвоить результат wholenumber.

Перечисления C++/CLI

Перечисления в программах C++/CLI существенно отличаются от тех, что приме- няются в программах ISO/ANSI С++. Прежде всего, они и определяются в C++/CLI иначе:

Этот оператор определяет перечислимый тип Suit (масть), и переменным типа Suit можно присваивать значения только из перечня, заданного в определении — Hearts, Clubs, Diamonds и Spades. Когда вы обращаетесь к константам из перечис- ления С++/СЫ, вы всегда должны квалифицировать их именем типа перечисления. Например:

Этот оператор присваивает значение Clubs из перечисления Suit переменной по имени suit. Символ, отделяющий имя типа Suit от имени перечислимой констан- ты Clubs — это операция разрешения контекста, которая указывает на то, что Clubs существует внутри контекста перечисления Suit.

Обратите внимание на ключевое слово class в определении перечисления, кото- рое следует за ключевым словом enum. Оно не появлялось в определении перечисле- ний в ISO/ANSI С++, как вы видели ранее, а идентифицирует только перечисления C++/CLI. Кроме того, оно указывает на еще одно отличие от перечислений ISO/ANSI С++; здесь константы, определенные в перечислении — Hearts, Clubs и так далее — являются объектами, а не простыми значениями фундаментального типа, как в версии ISO/ANSI С++. Фактически, по умолчанию они являются объектами типа Int32, поэ- тому каждая из них инкапсулирует значение типа int; однако перед тем как пытаться использовать их как таковые, вы должны привести эти константы к типу int.

Поскольку перечисления C++/CLI являются типом класса, вы не можете объяв- лять их локально, например, внутри функции, поэтому если вы хотите определить та- кое перечисление для использования, к примеру, в main (), то должны объявить его в глобальном контексте.


Ниже предлагается очень простой пример использования перечисления:



Этот пример выдаст на консоль следующее:



Это легко проиллюстрировать примером.

Описание полученных результатов

Поскольку это тип класса, перечисление Suit не может быть определено внутри функции main (), поэтому его определение помещено перед определением main (), а