﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-弄错的车站-随笔分类-C++/CLI</title><link>http://www.cppblog.com/golq/category/11113.html</link><description>孤独自由的旅人啊，
    亲吻着睡梦中的她，
        她的眼泪慢慢就变成了一朵花。</description><language>zh-cn</language><lastBuildDate>Tue, 07 Jul 2009 17:39:59 GMT</lastBuildDate><pubDate>Tue, 07 Jul 2009 17:39:59 GMT</pubDate><ttl>60</ttl><item><title>C++/CLI学习入门(四):字符串</title><link>http://www.cppblog.com/golq/archive/2009/07/07/89505.html</link><dc:creator>英勇的近卫军</dc:creator><author>英勇的近卫军</author><pubDate>Tue, 07 Jul 2009 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/golq/archive/2009/07/07/89505.html</guid><wfw:comment>http://www.cppblog.com/golq/comments/89505.html</wfw:comment><comments>http://www.cppblog.com/golq/archive/2009/07/07/89505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/golq/comments/commentRss/89505.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/golq/services/trackbacks/89505.html</trackback:ping><description><![CDATA[<p style="text-indent: 24pt;">C++/CLI字符串（Unicode字符组成的字符串）是指在System命名空间中定义的String类，即由System:Char类型的字符序列组成的字符串。它包含大量强大的功能，使得字符串的处理非常容易。创建一个String对象的方法如下例所示：</p>
<pre>System::String^ saying = L"<span style="color: #8b0000;">Many hands make light work.</span>";</pre>
<p style="text-indent: 24pt;">跟踪句柄saying用于访问String类对象。该对象的字符为宽字符，因为采用了前缀 &#8220;L&#8221;，如果省略&#8220;L&#8221;，该字符串由8位的字符组成，编译器将确保将其转换成宽字符。</p>
<p style="text-indent: 24pt;">访问字符串内字符可以像访问数组元素一样，使用索引来访问，首字符的索引为0。这种方法只能用于读取字符串内字符，但不能用于修改字符串的内容。</p>
<pre>Console::WriteLine("<span style="color: #8b0000;">The third character in the string is {0}</span>", saying[2]);</pre>
<p style="text-indent: 24pt;">利用Length属性，可以获取字符串内字符的数量（长度）。</p>
<pre>Console::WriteLine("<span style="color: #8b0000;">The saying has {0} charactors.</span>", saying-&gt;Length);</pre>
<h1>一、连接字符串</h1>
<p style="text-indent: 24pt;">利用 &#8220;+&#8221;可以连接字符串，形成新的字符串。执行下面的例子之后，name3将包含字符串 &#8220;Beth and Betty&#8221;。</p>
<pre>String^ name1 = L"<span style="color: #8b0000;">Beth</span>";
String^ name2 = L"<span style="color: #8b0000;">Betty</span>";
String^ name3 = name1+L"<span style="color: #8b0000;"> and </span>"+name2;</pre>
<p style="text-indent: 24pt;">&#8220;+&#8221;还可以用来连接字符串与数值、bool值等非字符串变量，在连接之前，这些变量将自动的转换成字符串。</p>
<pre>String^ str = L"<span style="color: #8b0000;">Value: </span>";
String^ str1 = str + 2.5;	<span style="color: #008000;">// str1 is "Value: 2.5"</span>
String^ str2 = str + 25;	<span style="color: #008000;">// str2 is "Value: 25"</span>
String^ str3 = str + <span style="color: #0000ff;">true</span>;	<span style="color: #008000;">// str3 is "Value: True"</span></pre>
<p style="text-indent: 24pt;">&#8220;+&#8221;还可以用来连接字符串与字符，但要注意，<strong>结果字符串的形式取决于字符的类型。</strong>这是因为char类型的字符被视为数值，wchar_t与String对象的字符具有相同的类型（Char类型）。</p>
<pre><span style="color: #0000ff;">char</span> ch = 'Z';
wchar_t wch = 'Z';
String^ str4 = str + ch;	<span style="color: #008000;">// str4 is "Value: 90"</span>
String^ str5 = str + wch;	<span style="color: #008000;">// str5 is "Value: Z"</span></pre>
<p style="text-indent: 24pt;">String类型定义了Join()函数，用于将数组中的多个字符串连接成一个字符串，数组元素之间用分隔符隔开，如</p>
<pre>array&lt;String^&gt;^ names = {"<span style="color: #8b0000;">Jill</span>", "<span style="color: #8b0000;">Ted</span>", "<span style="color: #8b0000;">Mary</span>", "<span style="color: #8b0000;">Eve</span>", "<span style="color: #8b0000;">Bill</span>"};
String^ seperator = "<span style="color: #8b0000;"> and </span>";
String^ joined = String::Join(seperator, names);	<span style="color: #008000;">// joined is "Jill and Ted and Mary and Eve and Bill"</span></pre>
<p style="text-indent: 24pt;"><strong>特别注意：String对象是固定不变的，一旦创建完毕后就不能再被修改了。这意味着所有的字符串操作都是在创建新的字符串。</strong></p>
<p style="text-indent: 24pt;"><em><u>例子：处理字符串</u></em></p>
<p style="text-indent: 24pt;">将整数数组内的元素按列整齐地输出。</p>
<pre><span style="color: #008000;">// Ex4_17.cpp : main project file.</span>
#include "<span style="color: #8b0000;">stdafx.h</span>"
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> System;
<span style="color: #0000ff;">int</span> main(array&lt;System::String ^&gt; ^args)
{
array&lt;<span style="color: #0000ff;">int</span>&gt;^ values = { 2, 456, 23, -46, 34211, 456, 5609, 112098, 234,
-76504, 341, 6788, -909121, 99, 10 };
String^ formatStr1 = "<span style="color: #8b0000;">{0, </span>";
String^ formatStr2 = "<span style="color: #8b0000;">}</span>";
String^ number;
<span style="color: #0000ff;">int</span> maxLength = 0;
<span style="color: #0000ff;">for</span> each(<span style="color: #0000ff;">int</span> value in values)
{
number = "<span style="color: #8b0000;"></span>"+value;
<span style="color: #0000ff;">if</span>(maxLength&lt;number-&gt;Length)
maxLength = number-&gt;Length;
}
String^ format = formatStr1+(maxLength+1)+formatStr2;
<span style="color: #0000ff;">int</span> numberPerLine = 3;
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0; i&lt;values-&gt;Length; i++)
{
Console::Write(format, values[i]);
<span style="color: #0000ff;">if</span>((i+1)%numberPerLine == 0)
Console::WriteLine();
}
}</pre>
<p style="text-indent: 24pt;">输出为</p>
<pre>       2     456      23
-46   34211     456
5609  112098     234
-76504     341    6788
-909121      99      10</pre>
<h1>二、修改字符串</h1>
<p style="text-indent: 24pt;">Trim()函数用于删除字符串头部和尾部的空格。不带参数调用该函数将删除字符串头、尾部的全部空格并返回一新字符串。</p>
<pre>String^ str = {"<span style="color: #8b0000;"> Handsome is as handsome does...     </span>"};
String^ newStr = str-&gt;Trim();</pre>
<p style="text-indent: 24pt;">也可传递给Trim()函数字符数组作为参数，字符串将<strong>从头部和尾部开始</strong>删除数组中的字符。如果字符出现在字符串中间，则不会被删除。</p>
<pre>String^ toBeTrimed = L"<span style="color: #8b0000;">wool wool sheep sheep wool wool wool</span>";
array&lt;wchar_t&gt;^ notWanted = {L'w', L'o', L'l', L' ' };
Console::WriteLine(toBeTrimed-&gt;Trim(notWanted));</pre>
<p style="text-indent: 24pt;">上面的语句将输出<br>sheep sheep</p>
<p style="text-indent: 24pt;">如果在上面的语句中没有加前缀&#8221;L&#8220;，则字符为char类型，对应于System::SByte类型。不过编译器将自动地将其转换成wchar_t类型（即System::Char类型）。</p>
<p style="text-indent: 24pt;">Trim()函数也支持直接输入要删除的字符列表，下面的语句将产生同样的输出</p>
<pre>Console::WriteLine(toBeTrimed-&gt;Trim(L'w', L'o', L'l', L' '));</pre>
<p style="text-indent: 24pt;">如果仅仅想要删除头部或者尾部中的一端，可以使用TrimStart或者TrimEnd函数。</p>
<p style="text-indent: 24pt;">如果要在字符串的一端填充空格或其它字符（这一般用于以固定宽度靠左或靠右对齐输出文本），可使用PadLeft()和PadRight()函数。如果字符串长度大于指定的长度参数，则返回字符串为长度等于原来字符串的新字符串。</p>
<pre>String^ value = L"<span style="color: #8b0000;">3.142</span>";
String^ leftPadded = value-&gt;PadLeft(10);	<span style="color: #008000;">// Result is "    3.142"</span>
String^ rightPadded = value-&gt;PadRight(10);	<span style="color: #008000;">// Result is "3.142    "</span>
String^ leftPadded2 = value-&gt;PadLeft(10, L'*');	<span style="color: #008000;">// Result is "*****3.142"</span>
String^ rightPadded2= value-&gt;PadRight(10,L'#');	<span style="color: #008000;">// Result is "3.142#####"</span></pre>
<p style="text-indent: 24pt;"> 如果需要将字符串转换成大写或小写，可使用ToUpper()或ToLower函数。</p>
<pre>String^ proverb = L"<span style="color: #8b0000;">Many hands make light work.</span>"
String^ upper = proverb-&gt;ToUpper();	<span style="color: #008000;">// Result is "MANY HANDS MAKE LIGHT WORK."</span></pre>
<p style="text-indent: 24pt;"> 如果需要在字符串中间插入一个字符串，可使用Insert()函数，第一个参数指定起始位置的索引，第二个参数指定要插入的字符串。</p>
<pre>String^ proverb = L"<span style="color: #8b0000;">Many hands light work.</span>";
String^ newProverb = proverb-&gt;Insert(5, "<span style="color: #8b0000;">deck </span>");</pre>
<p style="text-indent: 24pt;"> 结果是</p>
<pre>Many deck hands make light work.</pre>
<p style="text-indent: 24pt;"> 如果要用另一个字符替换字符串中指定的字符，或者用另一个子串替换字符串中给定的子串，可使用Replace()函数。</p>
<pre>String^ proverb = L"<span style="color: #8b0000;">Many hands make light work.</span>"
Console::WriteLine(proverb-&gt;Replace(L' ', L'*');
Console::WriteLine(proverb-&gt;Replace(L"<span style="color: #8b0000;">Many hands</span>", L"<span style="color: #8b0000;">Press switch</span>");</pre>
<p style="text-indent: 24pt;"> 输出为</p>
<pre>Many*hands*make*light*work.
Pressing switch make light work.</pre>
<h1>三、搜索字符串</h1>
<p style="text-indent: 24pt;"> 如果需要测试字符串是否以给定的子串开始或结束，可使用StartWith()或EndWith()函数。要寻找的子串句柄作为参数传递给函数，返回bool值。</p>
<pre>String^ snetence = L"<span style="color: #8b0000;">Hide, the cow's outside.</span>";
<span style="color: #0000ff;">if</span>(sentence-&gt;StartWith(L"<span style="color: #8b0000;">Hide</span>"))
Console::WriteLine("<span style="color: #8b0000;">The sentence starts with 'Hide'.</span>");</pre>
<p style="text-indent: 24pt;"> IndexOf()函数用于返回给定字符或子串在字符串中找到的第一个实例索引，如果未找到，则返回-1。</p>
<pre>String^ sentence = L"<span style="color: #8b0000;">Hide, the cow's outside.</span>";
<span style="color: #0000ff;">int</span> ePosition = sentence-&gt;IndexOf(L'e');	<span style="color: #008000;">// Return 3</span>
<span style="color: #0000ff;">int</span> thePosition = sentence-&gt;IndexOf(L"<span style="color: #8b0000;">the</span>");	<span style="color: #008000;">// Retuen 6</span></pre>
<p style="text-indent: 24pt;"> 也可以指定IndexOf搜索的起始索引，这一般用于遍历整个字符串找出所有的实例，如下面的例子：</p>
<pre><span style="color: #0000ff;">int</span> index = 0;
<span style="color: #0000ff;">int</span> count = 0;
<span style="color: #0000ff;">while</span>((index=words-&gt;IndexOf(word, index))&gt;=0)
{
index += word-&gt;Length;
count++;
}
Console::WriteLine(L"<span style="color: #8b0000;">'{0}' was found {1} times in: {2}</span>", word, count, words);</pre>
<p style="text-indent: 24pt;">LastIndexOf()函数类似于IndexOf()函数，不过它用于从字符串尾部或指定索引位置开始，倒着向头部搜索。注意：如果从尾部开始的索引值是words-&gt;Lenght-1。</p>
<p style="text-indent: 24pt;">如果要搜索一个字符串数组中任意元素出现在字符串中的位置，可以使用IndexOfAny()函数。同样，它也有倒序搜索的版本。 下面的例子说明了IndexOfAny()的用法。</p>
<p style="text-indent: 24pt;"><u><em>例子：搜索字符串中的标点符号</em></u></p>
<pre><span style="color: #008000;">// Ex4_18.cpp : main project file.</span>
#include "<span style="color: #8b0000;">stdafx.h</span>"
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> System;
<span style="color: #0000ff;">int</span> main(array&lt;System::String ^&gt; ^args)
{
array&lt;wchar_t&gt;^ punctuation = {L'"<span style="color: #8b0000;">', L'\'', L'.', L',', L':',L'!', L'?'};</span>
String^ sentence = L"<span style="color: #8b0000;">\"It's chilly in here\", the boy 's mother said coldly.</span>";
array&lt;wchar_t&gt;^ indicators = gcnew array&lt;wchar_t&gt;(sentence-&gt;Length){L' '};
<span style="color: #0000ff;">int</span> index = 0;
<span style="color: #0000ff;">int</span> count = 0;
<span style="color: #0000ff;">while</span>((index=sentence-&gt;IndexOfAny(punctuation, index))&gt;=0)
{
indicators[index] = L'^';
++index;
++count;
}
Console::WriteLine(L"<span style="color: #8b0000;">There are {0} punctuation charactors in the string:</span>", count);
Console::WriteLine(L"<span style="color: #8b0000;">\n{0}\n{1}</span>", sentence, gcnew String(indicators));
<span style="color: #0000ff;">return</span> 0;
}
<u><em>输出为</em></u></pre>
<pre>There are 6 punctuation charactors in the <span style="color: #0000ff;">string</span>:
"<span style="color: #8b0000;">It's chilly in here</span>", the boy 's mother said coldly.
^  ^                ^^         ^                    ^</pre><img src ="http://www.cppblog.com/golq/aggbug/89505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/golq/" target="_blank">英勇的近卫军</a> 2009-07-07 23:39 <a href="http://www.cppblog.com/golq/archive/2009/07/07/89505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++/CLI学习入门(三):数组</title><link>http://www.cppblog.com/golq/archive/2009/06/29/88733.html</link><dc:creator>英勇的近卫军</dc:creator><author>英勇的近卫军</author><pubDate>Sun, 28 Jun 2009 17:34:00 GMT</pubDate><guid>http://www.cppblog.com/golq/archive/2009/06/29/88733.html</guid><wfw:comment>http://www.cppblog.com/golq/comments/88733.html</wfw:comment><comments>http://www.cppblog.com/golq/archive/2009/06/29/88733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/golq/comments/commentRss/88733.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/golq/services/trackbacks/88733.html</trackback:ping><description><![CDATA[<p style="text-indent: 24pt;"> 要学习数组，必须先了解跟踪句柄。</p>
<h1>一、跟踪句柄</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 跟踪句柄类似于本地C++指针，但也有很大区别。跟踪句柄确实存储着某个对象的地址，但当CLR压缩堆过程中改变了该对象的地址，则垃圾回收器自动更新句柄所包含的地址。我们不能像本地指针那样用跟踪句柄来执行地址的算术运算，也不允许对跟踪句柄进行强制类型转换。  </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在CLR堆中创建的对象必须被跟踪句柄引用。所有属于引用类型的对象都存储在堆中，因此为引用这些对象所创建的变量都必须是跟踪句柄。例如，String类型是引用类型，因此引用String对象的变量必须是跟踪句柄。值类型默认分配在堆栈上，但也可以用gcnew操作符将其存储在堆上。此外必须注意，在堆上分配的变量——其中包括所有CLR引用类型——都不能在全局作用域内声明。  </p>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过在类型名称后加&#8221;^&#8221;符号，用于声明一个该类型的句柄。</p>
<p style="text-indent: 24pt;">声明了一个String类型的跟踪句柄proverb。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在声明时句柄时，系统自动为其分配一个空值，该句柄不引用任何对象。也可显示地将某个句柄置为空值: </p>
<pre>proverb = nullptr;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意不能用0来表示空值。如果用0来初始化某个句柄，则0将自动转换为被引用类型的对象，而句柄则指向该对象。
</p>
<p>可以在声明句柄时显示的将其初始化：</p>
<pre>String^ saying = L"<span style="color: #8b0000;">I used to think I was indecisive but now I??&#161;&#234;&#161;&#232;m not so sure.;</span>"
</pre>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该语句首先在堆上创建一个包含等号右边字符串的String对象，然后将该对象的地址存入saying中。注意字符串字面值的类型为const wchar_t*而非String。类String提供了这样的方法使得const wchar_t*类型的字符串可以用来创建String类型的对象。
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面这条语句创建了值类型的句柄：</p>
<pre><span style="color: #0000ff;">int</span>^ value = 99;</pre>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该语句在堆上创建一个Int32型的值类型变量，然后将该变量的地址存入句柄value中。由于value是一种指针，因此不能直接参与算术运算，可使用*运算符对地址求值（类似于本地C++指针那样）: </p>
<pre><span style="color: #0000ff;">int</span> result = 2*(*value)+15;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于*value表示value所指向地址存储的数值，因此result的值为2*99+15=213。注意，当value作为运算式左值时，不需要*即可对value指向的变量赋值。 </p>
<pre><span style="color: #0000ff;">int</span>^ result = 0;
result = 2*(*value)+15;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先创建了一个指向数值0的句柄result。（该语句会触发一条编译器警告，提示不能利用0来将句柄初始化为空值。）
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第2条语句=号右边为数值，而左边为句柄，编译器将自动将右值赋予句柄所指向的对象，即将其转换为如下语句 </p>
<pre>*result = 2*(*value)+15;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意，要采用上面的语句，result句柄必须实际定义过。如果仅仅声明了result，则会产生运行时错误 </p>
<pre><span style="color: #0000ff;">int</span>^ result;
*result = 2*(*value)+15;
</pre>
<p>
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是因为第二句要对地址result求值，即意味着result指向的对象已经存在，但实际并非如此，因为声明该对象时系统默认赋予其空值(nullptr)。在这种情况下，采用下面的方法就可以正常工作了 </p>
<pre><span style="color: #0000ff;">int</span>^ result;
result = 2*(*value)+15; </pre>
<h1>二、数组</h1>
<h2>(一)数组句柄</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLR数组是分配在可回收垃圾堆上的。必须用array&lt;<em>typename</em>&gt;指出要创建的数组，同其它CLR堆上的对象一样，需要用句柄来访问它，例子如下： </p>
<pre>array&lt;<span style="color: #0000ff;">int</span>&gt;^ data;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数组句柄data可用于存储对元素类型为int的一维数组的引用。下面的例子声明了一个句柄，并新建一个CLR数组来对此句柄初始化。</p>
<pre>array&lt;<span style="color: #0000ff;">int</span>&gt;^ data = gcnew array&lt;<span style="color: #0000ff;">int</span>&gt;(100);</pre>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和本地C++数组一样，CLR数组中元素的索引值也是从0开始的，可以通过[ ]访问数组元素。数组元素都是CLR对象，在上面的例子中数组元素为Int32型对象，它们在算术表达式中就像普通的整数类型一样。
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Length属性是数组的一个重要属性，记录着数组元素的数量。</p>
<pre><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0; i&lt;data-&gt;Length; i++)
data[i] = 2*(i+1);</pre>
<pre>&nbsp;&nbsp; 属性LongLength则保存了64位的数组长度。 </pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以用for each循环遍历数组元素。</p>
<pre>array&lt;<span style="color: #0000ff;">int</span>&gt;^ value = {3, 5, 6, 8, 6};
<span style="color: #0000ff;">for</span> each(<span style="color: #0000ff;">int</span> item in value)
{
item = 2*item + 1;
Console::WriteLine("<span style="color: #8b0000;">{0, 5}</span>", item);
}</pre>
<p>&#160;</p>
<p>&nbsp;&nbsp;&nbsp; 该循环输出5字符宽度的字段，以右对齐的方式输出当前元素的计算结果，输出如下：
</p>
<p>____7___11___13___17___13
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数组句柄可以被重新赋值，只要保持数组元素类型和维数（等级）不变即可，在前面例子中的数组句柄data指向一个int类型的一维数组，可以重新给它赋值，使其指向另外的int类型1维数组： </p>
<pre>data = gcnew array&lt;<span style="color: #0000ff;">int</span>&gt;(45);</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数组可以在创建时通过元素列表初始化，下例在CLR堆上创建了一个double类型的数组，并将引用赋值给了数组句柄： </p>
<pre>array&lt;<span style="color: #0000ff;">double</span>&gt;^ sample = {3.4, 2.3, 6.8, 1.2, 5.5, 4.9, 7.4, 1.6};
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果在声明数组句柄时不进行初始化，那么在给句柄赋值时不能采用上面的方法直接用元素列表用作右值，而必须采用显示创建的方式。即不能 </p>
<pre>array&lt;<span style="color: #0000ff;">double</span>&gt;^ sample;
sample = {3.4, 2.3, 6.8, 1.2, 5.5, 4.9, 7.4, 1.6}
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而必须采用如下方式 </p>
<pre>array&lt;<span style="color: #0000ff;">double</span>&gt;^ sample;
sample = gcnew array&lt;<span style="color: #0000ff;">double</span>&gt;{3.4, 2.3, 6.8, 1.2, 5.5, 4.9, 7.4, 1.6}
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于字符串数组，注意每一个元素也是引用类型，这是因为每一个元素String也是在CLR堆上创建的，因此也要用String^来访问它。 </p>
<pre>array&lt;String^&gt;^ names = {"<span style="color: #8b0000;">Jack</span>", "<span style="color: #8b0000;">John</span>", "<span style="color: #8b0000;">Joe</span>", "<span style="color: #8b0000;">Jessica</span>", "<span style="color: #8b0000;">Jim</span>", "<span style="color: #8b0000;">Joanna</span>"};
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以用Array类静态函数Clear()对数组中的连续数组元素清零。 </p>
<pre>Array::Clear(samples, 0, samples-&gt;Length);</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Clear()函数的第一个参数是被清零的数组，第二个参数是要清除地第一个元素的索引，第三个参数为要清除地元素数量。因此上述语句将samples数组的所有元素都置为0。如果Clear()清除的是某个跟踪句柄，则句柄所对应的元素都被应用Clear()函数。如果元素为bool型，则被置为false。
</p>
<h2>(二)数组排序</h2>
<p>Array类还定义了一个Sort()静态函数，可用于对数组进行排序。如果以数组句柄作为参数，则对整个数组排序。如果要对数组部分排序，则还需要增加元素起始索引及数量，如下例</p>
<pre><span style="color: #008000;">////////////////////////////////////////////////////////</span>
array&lt;<span style="color: #0000ff;">int</span>&gt;^ samples = {27, 3, 54, 11, 18, 2, 16};
Array::Sort(samples, 2, 3);
<span style="color: #008000;">//////////////////////////////////////////////////////// </span>
</pre>
<p>排序后数组元素变为{27, 3, <strong>11, 18, 54</strong>, 2, 16}
</p>
<p>Sort函数还有很多其它版本，下面的例子展示了如何排序两个相关的数组，即第一个数组中的元素是第二个数组对应元素的键。对第一个数组排序后，可对第二个数组进行相应的调整，使得键与值相互对应。</p>
<pre><span style="color: #008000;">///////////////////////////////////////////////////////////////////////////</span>
<span style="color: #008000;">// Ex4_13.cpp : main project file.</span>
#include "<span style="color: #8b0000;">stdafx.h</span>"
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> System;
<span style="color: #0000ff;">int</span> main(array&lt;System::String ^&gt; ^args)
{
array&lt;String^&gt;^ names = { "<span style="color: #8b0000;">Jill</span>", "<span style="color: #8b0000;">Ted</span>", "<span style="color: #8b0000;">Mary</span>", "<span style="color: #8b0000;">Eve</span>", "<span style="color: #8b0000;">Bill</span>", "<span style="color: #8b0000;">Al</span>" };
array&lt;<span style="color: #0000ff;">int</span>&gt;^ weights = {103, 168, 128, 115, 180, 176};
Array::Sort(names, weights);
<span style="color: #0000ff;">for</span> each( String^ name in names )
Console::Write(L"<span style="color: #8b0000;">{0, 10}</span>", name);
Console::WriteLine();
<span style="color: #0000ff;">for</span> each(<span style="color: #0000ff;">int</span> weight in weights)
Console::Write(L"<span style="color: #8b0000;">{0, 10}</span>", weight);
Console::WriteLine();
<span style="color: #0000ff;">return</span> 0;
}
<span style="color: #008000;">/////////////////////////////////////////////////////////////////////////////</span></pre>
<p>输出为： </p>
<p>Al Bill Eve Jill Mary Ted
</p>
<p>176 180 115 103 128 168
</p>
<p><u><em>例子说明</em></u>
</p>
<p>Sort()函数对2个数组排序时，用第一个数组参数来确定两个数组的顺序，以此保持2个数组元素对应关系不变。
</p>
<h2>(三)数组搜索</h2>
<p style="text-indent: 24pt;"> Array类还提供了函数BinarySearch()以使用对分法搜索算法，对一维数组或给定范围内搜索特定元素的索引位置。使用该函数要求数组必须是顺序排列的，因此在搜索之前必须对数组进行排序。</p>
<pre>array&lt;<span style="color: #0000ff;">int</span>&gt;^ value = { 23, 45, 68, 94, 123, 150, 203, 299 };
<span style="color: #0000ff;">int</span> toBeFound = 127;
<span style="color: #0000ff;">int</span> position = Array::BinarySearch(value, toBeFound);
<span style="color: #0000ff;">if</span>(position&lt;0)
Console::WriteLine(L"<span style="color: #8b0000;">{0} was not found.</span>", toBeFound);
<span style="color: #0000ff;">else</span>
Console::WriteLine(L"<span style="color: #8b0000;">{0} was found at index position {1}</span>", toBeFound, position);
</pre>
<p style="text-indent: 24pt;"> Array::BinarySearch()的第一个参数是被搜索数组的句柄，第二个参数是要查找的内容，返回值为int类型的数值。如果返回值小于0则说明未找到。如果要指定搜索范围，则需要传递4个参数，其中第2参数为搜索起始索引，第3参数为搜索的元素数量，第4个是要搜索的内容。</p>
<pre>array&lt;<span style="color: #0000ff;">int</span>&gt;^ value = { 23, 45, 68, 94, 123, 150, 203, 299 };
<span style="color: #0000ff;">int</span> toBeFound = 127;
<span style="color: #0000ff;">int</span> position = Array::BinarySearch(value, 3, 6, toBeFound);</pre>
<pre>    上面的代码从第4个元素开始，一直搜索到结束位置。</pre>
<pre><u><em>例子：搜索数组</em></u></pre>
<pre><span style="color: #008000;">///////////////////////////////////////////////////////////////////////////////////////</span>
<span style="color: #008000;">// Ex4_14.cpp : main project file.</span>
#include "<span style="color: #8b0000;">stdafx.h</span>"
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> System;
<span style="color: #0000ff;">int</span> main(array&lt;System::String ^&gt; ^args)
{
array&lt;String^&gt;^ names = { "<span style="color: #8b0000;">Jill</span>", "<span style="color: #8b0000;">Ted</span>", "<span style="color: #8b0000;">Mary</span>", "<span style="color: #8b0000;">Eve</span>", "<span style="color: #8b0000;">Bill</span>", "<span style="color: #8b0000;">Al</span>", "<span style="color: #8b0000;">Ned</span>", "<span style="color: #8b0000;">Zoe</span>", "<span style="color: #8b0000;">Dan</span>", "<span style="color: #8b0000;">Jean</span>" };
array&lt;<span style="color: #0000ff;">int</span>&gt;^ weights = {103, 168, 128, 115, 180, 176, 209, 98, 190, 130};
array&lt;String^&gt;^ toBeFound = {"<span style="color: #8b0000;">Bill</span>", "<span style="color: #8b0000;">Eve</span>", "<span style="color: #8b0000;">Al</span>", "<span style="color: #8b0000;">Fred</span>"};
<span style="color: #0000ff;">int</span> result = 0;
Array::Sort(names, weights);
<span style="color: #0000ff;">for</span> each( String^ name in toBeFound )
{
result = Array::BinarySearch(names, name);
<span style="color: #0000ff;">if</span>(result&lt;0)
Console::WriteLine(L"<span style="color: #8b0000;">{0} was not found.</span>", name);
<span style="color: #0000ff;">else</span>
Console::WriteLine(L"<span style="color: #8b0000;">{0} weights {1} lbs.</span>", name, weights[result]);
}
<span style="color: #0000ff;">return</span> 0;
}
<span style="color: #008000;">///////////////////////////////////////////////////////////////////////////////////////</span></pre>
<p><u><em>例子说明</em></u>
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当搜索不到目标时，Array::BinarySearch()函数输出的并非任意负数，而是第一个大于该目标的元素索引值的按位补码。利用该方法，可以不打乱顺序在数组中插入新值。如，我们希望插入&#8221;Fred&#8221;到names数组中</p>
<pre>array&lt;String^&gt;^ names = { "<span style="color: #8b0000;">Jill</span>", "<span style="color: #8b0000;">Ted</span>", "<span style="color: #8b0000;">Mary</span>", "<span style="color: #8b0000;">Eve</span>", "<span style="color: #8b0000;">Bill</span>", "<span style="color: #8b0000;">Al</span>", "<span style="color: #8b0000;">Ned</span>", "<span style="color: #8b0000;">Zoe</span>", "<span style="color: #8b0000;">Dan</span>", "<span style="color: #8b0000;">Jean</span>" }
Array::Sort(names);
String^ name = L"<span style="color: #8b0000;">Fred</span>";
<span style="color: #0000ff;">int</span> position = Array::BinarySearch(names, name);
<span style="color: #0000ff;">if</span>(position&lt;0)
position = ~position;</pre>
<p style="text-indent: 24pt;"> 此时，position保存的是大于Fred的第一个元素的位置，该数值可用于插入新值。</p>
<pre>array&lt;String^&gt;^ newNames = gcnew array&lt;String^&gt;(names-&gt;Length+1);
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0;i&lt;position;i++)
newNames[i] = names[i];
newNames[position] = name;
<span style="color: #0000ff;">if</span>(position&lt;name-&gt;Length)
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=position; i&lt;names-&gt;Length; i++)
newNames[i+1] = names[i];
names = nullptr;</pre>
<p style="text-indent: 24pt;"> 最后一句用于删除names数组。</p>
<font face="Courier New"></font>
<p>&#160;</p>
<h2>(四)多维数组</h2>
<p style="text-indent: 24pt;"> C++/CLI中可以创建多维数组，最大维数32维。与ISO/ANSI C++不同的是，C++/CLI中的多维数组并非数组的数组，而是真正的多维数组，创建整数多维数组方法如下：</p>
<pre>array&lt;<span style="color: #0000ff;">int</span> 2&gt;^ value = gcnew array&lt;<span style="color: #0000ff;">int</span>, 2&gt;(4, 5);</pre>
<p style="text-indent: 24pt;"> 上面的代码创建了一个二维数组，四行五列，共20个元素。访问的方法是利用多个用逗号分隔的索引值来访问每一个元素，而不能用一个索引值访问一行</p>
<pre><span style="color: #0000ff;">int</span> nrows = 4;
<span style="color: #0000ff;">int</span> ncols = 5;
array&lt;<span style="color: #0000ff;">int</span>, 2&gt;^ value = gcnew array&lt;<span style="color: #0000ff;">int</span>, 2&gt;(nrows, ncols);
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0; i&lt;nrows; i++)
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> j=0; j&lt;ncols; j++)
value[i, j] = (i+1)*(j+1);
</pre>
<p style="text-indent: 24pt;"> 上面的代码利用循环给二维数组value赋值。这里访问二维数组元素的符号与本地C++不同：后者实际上是数组的数组，而C++/CLI是真正的二维数组，不能用一个索引值来访问二维数组，那样是没有意义的。数组的维数被称为等级，上面value数组的等级为2。而本地C++数组的等级始终为1。当然，在C++/CLI中也可以定义数组的数组，方法见下例</p>
<p style="text-indent: 24pt;">例子：使用多维数组</p>
<pre><span style="color: #008000;">///////////////////////////////////////////////////////////////////////////</span>
<span style="color: #008000;">// Ex4_15.cpp : main project file.</span>
#include "<span style="color: #8b0000;">stdafx.h</span>"
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> System;
<span style="color: #0000ff;">int</span> main(array&lt;System::String ^&gt; ^args)
{
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> SIZE = 12;
array&lt;<span style="color: #0000ff;">int</span>, 2&gt;^ products = gcnew array&lt;<span style="color: #0000ff;">int</span>, 2&gt;(SIZE, SIZE);
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0; i&lt;SIZE; i++)
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> j=0; j&lt;SIZE; j++)
products[i, j] = (i+1)*(j+1);
Console::WriteLine(L"<span style="color: #8b0000;">Here is the {0} times table:</span>", SIZE);
<span style="color: #008000;">// Write horizontal divider line</span>
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0; i&lt;=SIZE; i++)
Console::Write(L"<span style="color: #8b0000;">_____</span>");
Console::WriteLine();
<span style="color: #008000;">// Write top line of table</span>
Console::Write(L"<span style="color: #8b0000;">    |</span>");
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=1; i&lt;=SIZE; i++)
Console::Write("<span style="color: #8b0000;">{0, 3} |</span>", i);
Console::WriteLine();
<span style="color: #008000;">// Write horizontal divider line with verticals</span>
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0; i&lt;=SIZE; i++)
Console::Write("<span style="color: #8b0000;">____|</span>", i);
Console::WriteLine();
<span style="color: #008000;">// Write remaining lines</span>
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0; i&lt;SIZE; i++)
{
Console::Write(L"<span style="color: #8b0000;">{0, 3} |</span>", i+1);
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> j=0; j&lt;SIZE; j++)
Console::Write("<span style="color: #8b0000;">{0, 3} |</span>", products[i, j]);
Console::WriteLine();
}
<span style="color: #008000;">// Write horizontal divider line</span>
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0; i&lt;=SIZE; i++)
Console::Write("<span style="color: #8b0000;">_____</span>", i);
Console::WriteLine();
<span style="color: #0000ff;">return</span> 0;
}
<span style="color: #008000;">/////////////////////////////////////////////////////////////////////////////////////////////</span></pre>
<p style="text-indent: 24pt;">例子说明</p>
<p style="text-indent: 24pt;">上面的例子创建了一个12x12的乘法表，输出如下：</p>
<pre>Here is the 12 times table:
_________________________________________________________________
|  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 | 12 |
____|____|____|____|____|____|____|____|____|____|____|____|____|
1 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 | 12 |
2 |  2 |  4 |  6 |  8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 |
3 |  3 |  6 |  9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 | 33 | 36 |
4 |  4 |  8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 |
5 |  5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 |
6 |  6 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 | 60 | 66 | 72 |
7 |  7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 70 | 77 | 84 |
8 |  8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 | 72 | 80 | 88 | 96 |
9 |  9 | 18 | 27 | 36 | 45 | 54 | 63 | 72 | 81 | 90 | 99 |108 |
10 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 |100 |110 |120 |
11 | 11 | 22 | 33 | 44 | 55 | 66 | 77 | 88 | 99 |110 |121 |132 |
12 | 12 | 24 | 36 | 48 | 60 | 72 | 84 | 96 |108 |120 |132 |144 |
_________________________________________________________________</pre>
<p style="text-indent: 24pt;"> 其中创建二维数组的代码如下：</p>
<pre><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> SIZE = 12;
array&lt;<span style="color: #0000ff;">int</span>, 2&gt;^ products = gcnew array&lt;<span style="color: #0000ff;">int</span>, 2&gt;(SIZE, SIZE);</pre>
<p style="text-indent: 24pt;"> 第一行定义了一个整型常量SIZE，用于指定每一维数组的元素数量，第二行代码定义了一个等级2的数组，为12x12大小，该数组用于存储12x12的乘法表乘积。然后在嵌套循环中给数组赋值，大部分代码用于格式化输出以使其更加美观，这里就不再说明。</p>
<h2>(五)数组的数组</h2>
<p style="text-indent: 24pt;"> 如果数组的元素是引用数组的跟踪句柄，那么就可以创建数组的数组。同时，每一维数组的长度可以不同，即所谓的&#8220;锯齿形数组&#8221;。例如，用ABCDE来表示学生的成绩等级，根据等级分组存储班内学生的姓名，则可以创建一个包含5个元素的数组，每个元素为一个姓名数组（即字符串数组）</p>
<pre>array&lt;array&lt;String ^&gt;^&gt;^ grades = gcnew array&lt;array&lt;String^&gt;^&gt;(5)</pre>
<p style="text-indent: 24pt;">利用上面创建的数组，然后可以创建5个姓名数组了</p>
<pre>grades[0] = gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Louise</span>", "<span style="color: #8b0000;">Jack</span>"};
grades[1] = gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Bill</span>", "<span style="color: #8b0000;">Mary</span>", "<span style="color: #8b0000;">Ben</span>", "<span style="color: #8b0000;">Joan</span>"};
grades[2] = gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Jill</span>", "<span style="color: #8b0000;">Will</span>", "<span style="color: #8b0000;">Phil</span>"};
grades[3] = gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Ned</span>", "<span style="color: #8b0000;">Fred</span>", "<span style="color: #8b0000;">Ted</span>", "<span style="color: #8b0000;">Jed</span>", "<span style="color: #8b0000;">Ed</span>"};
grades[4] = gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Dan</span>", "<span style="color: #8b0000;">Ann</span>"};</pre>
<p style="text-indent: 24pt;"> grades[n]访问grades数组的第n个元素，而各元素为指向String^类型数组的句柄，因此上面的语句用于创建了String对象句柄的数组，并将创建数组的地址赋值给了grades数组元素。同时，这些字符串数组的长度是不同的。</p>
<p style="text-indent: 24pt;">上面的语句也可以用一个初始化语句来实现</p>
<pre>array&lt;array&lt;String^&gt;^&gt;^ grades = gcnew array&lt;array&lt;String^&gt;^&gt;
{
gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Louise</span>", "<span style="color: #8b0000;">Jack</span>"},
gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Bill</span>", "<span style="color: #8b0000;">Maray</span>", "<span style="color: #8b0000;">Ben</span>", "<span style="color: #8b0000;">Joan</span>"},
gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Jill</span>", "<span style="color: #8b0000;">Will</span>", "<span style="color: #8b0000;">Phil</span>"},
gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Ned</span>", "<span style="color: #8b0000;">Fred</span>", "<span style="color: #8b0000;">Ted</span>", "<span style="color: #8b0000;">Jed</span>", "<span style="color: #8b0000;">Ed</span>"},
gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Dan</span>", "<span style="color: #8b0000;">Ann</span>"},
};</pre>
<p style="text-indent: 24pt;"> 元素的初值必须写在花括号里。</p>
<p style="text-indent: 24pt;"><u><em>例子：使用数组的数组</em></u></p>
<pre><span style="color: #008000;">////////////////////////////////////////////////////////////////////////</span>
<span style="color: #008000;">// Ex4_16.cpp : main project file.</span>
#include "<span style="color: #8b0000;">stdafx.h</span>"
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> System;
<span style="color: #0000ff;">int</span> main(array&lt;System::String ^&gt; ^args)
{
array&lt;array&lt;String^&gt;^&gt;^ grades = gcnew array&lt;array&lt;String^&gt;^&gt;
{
gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Louise</span>", "<span style="color: #8b0000;">Jack</span>"},
gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Bill</span>", "<span style="color: #8b0000;">Maray</span>", "<span style="color: #8b0000;">Ben</span>", "<span style="color: #8b0000;">Joan</span>"},
gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Jill</span>", "<span style="color: #8b0000;">Will</span>", "<span style="color: #8b0000;">Phil</span>"},
gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Ned</span>", "<span style="color: #8b0000;">Fred</span>", "<span style="color: #8b0000;">Ted</span>", "<span style="color: #8b0000;">Jed</span>", "<span style="color: #8b0000;">Ed</span>"},
gcnew array&lt;String^&gt;{"<span style="color: #8b0000;">Dan</span>", "<span style="color: #8b0000;">Ann</span>"}
};
wchar_t gradeLetter = 'A';
<span style="color: #0000ff;">for</span> each(array&lt;String^&gt;^ grade in grades)
{
Console::WriteLine(L"<span style="color: #8b0000;">Students with Grade {0}:</span>", gradeLetter++);
<span style="color: #0000ff;">for</span> each(String^ student in grade)
Console::Write("<span style="color: #8b0000;">{0, 12}</span>", student);
Console::WriteLine();
}
<span style="color: #0000ff;">return</span> 0;
}
<span style="color: #008000;">///////////////////////////////////////////////////////////////////////////</span></pre>
<p style="text-indent: 24pt;"><u><em> 例子说明</em></u></p>
<p style="text-indent: 24pt;">输出为</p>
<pre>Students with Grade A:
Louise        Jack
Students with Grade B:
Bill       Maray         Ben        Joan
Students with Grade C:
Jill        Will        Phil
Students with Grade D:
Ned        Fred         Ted         Jed          Ed
Students with Grade E:
Dan         Ann</pre><img src ="http://www.cppblog.com/golq/aggbug/88733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/golq/" target="_blank">英勇的近卫军</a> 2009-06-29 01:34 <a href="http://www.cppblog.com/golq/archive/2009/06/29/88733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++/CLI学习入门(二):控制与循环</title><link>http://www.cppblog.com/golq/archive/2009/06/27/88645.html</link><dc:creator>英勇的近卫军</dc:creator><author>英勇的近卫军</author><pubDate>Sat, 27 Jun 2009 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/golq/archive/2009/06/27/88645.html</guid><wfw:comment>http://www.cppblog.com/golq/comments/88645.html</wfw:comment><comments>http://www.cppblog.com/golq/archive/2009/06/27/88645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/golq/comments/commentRss/88645.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/golq/services/trackbacks/88645.html</trackback:ping><description><![CDATA[<h4><font face="黑体" size="2">一、基本控制结构</font></h4>
<p><font face="Tahoma" size="1">ISO/ANSI C++中的控制与循环全部适用于C++/CLI。下例展示了C++/CLI控制台程序中的控制循环：</font></p>
<h4>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">// Ex3_15.cpp : main project file.</font> </p>
            <p><font face="Tahoma" size="1">#include "stdafx.h"</font> </p>
            <p><font face="Tahoma" size="1">using namespace System;</font> </p>
            <p><font face="Tahoma" size="1">int main(array&lt;System::String ^&gt; ^args)</font> </p>
            <p><font face="Tahoma" size="1">{</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; wchar_t letter;</font> </p>
            <p><font face="Tahoma" size="1"></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; Console::Write(L"Enter a letter:");</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; letter = Console::Read();</font> </p>
            <p><font face="Tahoma" size="1"></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; if(letter&gt;='A')</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(letter&lt;='Z')</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console::WriteLine(L"You entered a captial letter.");</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font> </p>
            <p><font face="Tahoma" size="1"></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; if(letter&gt;='a')</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(letter&lt;='z')</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console::WriteLine(L"You entered a small letter.");</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font> </p>
            <p><font face="Tahoma" size="1"></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; Console::WriteLine(L"You did not enter a letter.");</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; return 0;</font> </p>
            <p><font face="Tahoma" size="1">}</font></p>
            </td>
        </tr>
    </tbody>
</table>
</h4>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; letter被声明为wchar_t类型，映射为C++/CLI中的System::Char类型，它具有一些特殊的功能，其中包括将字符代码转换为大写和小写的函数：Char::ToUpper（）和Char::ToLower()，被转换的函数作为参数被传递给它：</font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">wchar_t uppercaseLetter = Char::ToUpper(letter);</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此外还包括检测字母是否大写或小写的函数:IsUpper()和IsLower()，因此上例可改为</font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">wchar_t letter;</font> </p>
            <p><font face="Tahoma" size="1">wchar_t upper;</font> </p>
            <p><font face="Tahoma" size="1">Console::Write(L"Enter a letter:");</font> </p>
            <p><font face="Tahoma" size="1">letter = Console::Read();</font> </p>
            <p><font face="Tahoma" size="1">upper = Char::ToUpper(letter);</font> </p>
            <p><font face="Tahoma" size="1">if(upper&gt;='A' &amp;&amp; upper&lt;='Z')</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; Console::WriteLine(L"You entered a {0} letter.", Char::IsUpper(letter) ? "Capital":"Small");</font> </p>
            <p><font face="Tahoma" size="1">else</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; Console::WriteLine(L"You entered a small letter.");</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1"><u><em>例子：下面看一个新的例子，试一试使用Console::ReadKey()函数，并初步了解ConsoleKeyInfo类。</em></u></font>
<table border="1" cellpadding="0" cellspacing="0" width="761">
    <tbody>
        <tr>
            <td valign="top" width="759">
            <p><font face="Tahoma" size="1">// Ex3_16.cpp : main project file.</font> </p>
            <p><font face="Tahoma" size="1">#include "stdafx.h"</font> </p>
            <p><font face="Tahoma" size="1">using namespace System;</font> </p>
            <p><font face="Tahoma" size="1">int main(array&lt;System::String ^&gt; ^args)</font> </p>
            <p><font face="Tahoma" size="1">{</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; ConsoleKeyInfo keyPress;</font> </p>
            <p><font face="Tahoma" size="1"></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; Console::WriteLine(L"Press a key combination - press Escape to quit.");</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; do{</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keyPress = Console::ReadKey(true);</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console::Write(L"You pressed");</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(safe_cast&lt;int&gt;(keyPress.Modifiers)&gt;0)</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console::Write(L" {0}", keyPress.Modifiers);</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console::WriteLine(L" {0} which is the {1} character。", keyPress.Key, keyPress.KeyChar);</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; }while(keyPress.Key != ConsoleKey::Escape);</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; return 0;</font> </p>
            <p><font face="Tahoma" size="1">}</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1"><em>该程序的输入示例如下：</em></font> </p>
<p><font face="Tahoma" size="1"><em>Press a key combination &#8211; press Escape to quit.</em></font> </p>
<p><font face="Tahoma" size="1"><em>You pressed Shift A which is the A character.</em></font> </p>
<p><font face="Tahoma" size="1"><em>You pressed Control Ａ which is the character.</em></font> </p>
<p><font face="Tahoma" size="1"><em>You pressed Alt A which is the a character.</em></font> </p>
<p><font face="Tahoma" size="1"><em>You pressed Escape which is the &#8592; character.</em></font> </p>
<p><font face="Tahoma" size="1"><em>请按任意键继续. . .</em></font> </p>
<p><font face="Tahoma" size="1"><u><em>例子说明</em></u></font> </p>
<p><font face="Tahoma" size="1"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console::ReadKey()函数用于测试按键，并将结果存储在ConsoleKeyInfo类对象里。该类有3个可访问属性用于帮助确定被按下的键是哪个或哪些键。属性Key识别被按下的键是哪个，属性KeyChar是被按键的Unicode字符码，属性Modifiers表示Shift,Alt,Ctrl键的按位组合，它是定义在System命名空间中的枚举类型ConsoleModifiers的常量，包括Shift\Alt\Control。</em></font> </p>
<p><font face="Tahoma" size="1"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 应该注意的是，在C++/CLI中枚举常量在用作数值之前必须被显示的强制转换为值类型（整数类型）。</em></font> </p>
<p><font face="Tahoma" size="1"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从输出中可以看出，当不只一个键被按下时，用一条语句就可以得到所有的键。这是因为Modifiers枚举类型是用FlagsAttribute属性定义的，该属性表明这种枚举类型是一组唯一的位标志。这使得该枚举类型的变量可以由若干与在一起的标志位组成，而Write()或WriteLine()函数可以识别并输出各标志位。</em></font> </p>
<h4><font face="黑体" size="2">二、for each循环</font></h4>
<p><font face="Tahoma" size="1"><u><em>例子：从例子开始：</em></u></font>
<table border="1" cellpadding="0" cellspacing="0" width="753">
    <tbody>
        <tr>
            <td valign="top" width="751">
            <p><font face="Tahoma" size="1">// Ex3_17.cpp : main project file.</font> </p>
            <p><font face="Tahoma" size="1">#include "stdafx.h"</font> </p>
            <p><font face="Tahoma" size="1">using namespace System;</font> </p>
            <p><font face="Tahoma" size="1">int main(array&lt;System::String ^&gt; ^args)</font> </p>
            <p><font face="Tahoma" size="1">{</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; int volwels = 0;</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; int consonants = 0;</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp; String^ proverb = L"A nod is as good as a wink to a blind horse.";</font> </p>
            <p><font face="Tahoma" size="1"></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp; for each(wchar_t ch in proverb)</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp; {</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Char::IsLetter(ch))</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = Char::ToLower(ch);</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(ch)</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'a': case 'e': case 'i': case 'o': case 'u':</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++volwels;</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</font> </p>
            <p><font face="Tahoma" size="1"></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++consonants;</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; }</font> </p>
            <p><font face="Tahoma" size="1"></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; Console::WriteLine(proverb);</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; Console::WriteLine(L"The proverb contains {0} volwels and {1} consonants.", </font><font face="Tahoma" size="1">volwels, consonants);</font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; return 0;</font> </p>
            <p><font face="Tahoma" size="1">}</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1"><em>输出如下：</em></font> </p>
<p><font face="Tahoma" size="1"><em>A nod is as good as a wink to a blind horse.</em></font> </p>
<p><font face="Tahoma" size="1"><em>The proverb contains 14 volwels and 18 consanants.</em></font> </p>
<p><font face="Tahoma" size="1"><u><em>例子说明</em></u></font> </p>
<p><font face="Tahoma" size="1"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该程序计算字符串中的元音与辅音字母的个数。下面的语句定义了要分析的字符串：</em></font> </p>
<p><font face="Tahoma" size="1"><em>String^ proverb = L&#8221;A nod is as good as a wink to a blinds horse&#8221;;</em></font> </p>
<p><font face="Tahoma" size="1"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proverb变量为String句柄的String^类型，句柄被用来存储CLR管理的无用单元堆上的某个对象的位置。重复处理proverb所引用字符串中各个字符的for each循环形式如下：</em></font> </p>
<p><font face="Tahoma" size="1"><em>for each(wchar_t ch in proverb)</em></font> </p>
<p><font face="Tahoma" size="1"><em>{</em></font> </p>
<p><font face="Tahoma" size="1"><em>&nbsp;&nbsp;&nbsp; // Process the current character stored in ch &#8230;</em></font> </p>
<p><font face="Tahoma" size="1"><em>}</em></font> </p>
<p><font face="Tahoma" size="1"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于proverb字符串中的字符都是Unicode字符，因此用wchar_t（映射为Char类型）类型的变量来存储这些字符。变量ch为循环内的局部变量。</em></font></p><img src ="http://www.cppblog.com/golq/aggbug/88645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/golq/" target="_blank">英勇的近卫军</a> 2009-06-27 16:46 <a href="http://www.cppblog.com/golq/archive/2009/06/27/88645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++/CLI学习入门(一)：基础</title><link>http://www.cppblog.com/golq/archive/2009/06/27/88644.html</link><dc:creator>英勇的近卫军</dc:creator><author>英勇的近卫军</author><pubDate>Sat, 27 Jun 2009 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/golq/archive/2009/06/27/88644.html</guid><wfw:comment>http://www.cppblog.com/golq/comments/88644.html</wfw:comment><comments>http://www.cppblog.com/golq/archive/2009/06/27/88644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/golq/comments/commentRss/88644.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/golq/services/trackbacks/88644.html</trackback:ping><description><![CDATA[<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从今日开始，将前期学习《Visual C++ 2005入门经典》（<em>Ivor Horton著 清华大学出版社出版</em>）的相关笔记整理到随笔中，希望能和C++/CLI爱好者分享学习过程中的心得。文中主要内容和例子摘自原书相关章节，如有侵权，请留言或来信告知。 </font> </p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相比于ISO/ANSI C++而言，C++/CLI进行了大量的扩充，并且提供了大量的附加功能。主要包括： </font> </p>
<ol>
    <li><font face="Tahoma" size="1">在C++/CLI程序中，所有ISO/ANSI基本数据类型都可以使用，但在一些特殊的上下文环境中，它们具有一些额外属性； </font> </li>
    <li><font face="Tahoma" size="1">在控制台程序中，C++/CLI对键盘和命令行输出提供了自己的机制； </font> </li>
    <li><font face="Tahoma" size="1">C++/CLI中引入了safe_cast运算符，确保强制类型转换操作能够生成可检验的代码； </font> </li>
    <li><font face="Tahoma" size="1">C++/CLI提供了另外一种基于类的枚举功能，其灵活性超过了ISO/ANSI C++中的enum声明。</font></li>
</ol>
<p><font size="1"><font face="Tahoma"><font face="黑体" size="2">一、基本数据类型</font> </font></font> </p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp; C++/CLI中包括了所有ISO/ASNI C++中的基本数据类型，算术运算也和本地C++完全一样。除此之外，C++/CLI中还定义了2种整数类型，如表1所示： </font> </p>
<div align="center"><font face="Tahoma" size="1">表1</font></div>
<div align="center">
<table align="center" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="159">
            <p align="center"><strong><font face="Tahoma" size="1">类型</font></strong></p>
            </td>
            <td valign="top" width="66">
            <p><strong><font face="Tahoma" size="1">字节</font></strong></p>
            </td>
            <td valign="top" width="383">
            <p><strong><font face="Tahoma" size="1">值域</font></strong></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="159">
            <p align="left"><strong><font face="Tahoma" size="1">long long</font></strong></p>
            </td>
            <td valign="top" width="66">
            <p><font face="Tahoma" size="1">8</font></p>
            </td>
            <td valign="top" width="383">
            <p><font face="Tahoma" size="1">从-9223372036854775808到9223372036854775807</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="159">
            <p><strong><font face="Tahoma" size="1">Unsigned long long</font></strong></p>
            </td>
            <td valign="top" width="66">
            <p><font face="Tahoma" size="1">8</font></p>
            </td>
            <td valign="top" width="383">
            <p align="left"><font face="Tahoma" size="1">从0到18446744073709551615</font></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定long long数据类型时，需要在整数数值后面加LL或小写字母ll，如</font></p>
<p>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><strong><font face="Tahoma" size="1">longlong big = 123456789LL;</font></strong></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定unsinged long long类型时，需要在整数数值后面加ULL或小写字母ull，如 </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><strong><font face="Tahoma" size="1">unsigned long long huge = 123456789LL;</font></strong></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在C++/CLI中，每一个ISO/ANSI C++基本类型名称都映射到System命名空间中定义的值类类型。在C++/CLI程序中，ISO/ANSI C++基本类型名称都是CLI中对应值类类型的简略形式。表2给出了基本类型、占用内存以及对应的值类类型。</font></p>
<p align="center"><font face="Tahoma" size="1">表2</font></p>
<p align="center">
<table border="1" cellpadding="0" cellspacing="0" width="419">
    <tbody>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">基本类型</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><strong><font face="Tahoma" size="1">字节</font></strong></p>
            </td>
            <td valign="top" width="202">
            <p><font size="1"><font face="Tahoma"><strong>CLI</strong><strong>值类类型</strong></font></font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">bool</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">1</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::Boolean</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">char</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">1</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::SByte</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">singed char</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">1</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::SByte</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">unsigned char</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">1</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::Byte</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">short</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">2</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System:Int16</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">unsigned short</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">2</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::UInt16</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">int</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">4</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::Int32</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">unsigned int</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">4</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::UInt32</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">long</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">4</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::Int32</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">unsigned long</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">4</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::UInt32</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">long long</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">8</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::Int64</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">unsigned long long</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">8</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::UInt64</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">float</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">4</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::Single</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">double</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">8</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::Double</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">long double</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">8</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::Double</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="158">
            <p><strong><font face="Tahoma" size="1">wchar_t</font></strong></p>
            </td>
            <td valign="top" width="57">
            <p><font face="Tahoma" size="1">2</font></p>
            </td>
            <td valign="top" width="202">
            <p><font face="Tahoma" size="1">System::Char</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认情况下，char类型被视为singed char，因此其关联的值类类型为System::SByte。如果编译选项/J，则char 默认为unsigned char，此时关联为System::Byte。System为根命名空间名，C++/CLI的值类类型在这个空间中定义。此外System空间中还定义了许多其他类型，如表示字符串的String类型、精确存储的十进制小数类型Decimal等等。 </font> </p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在C++/CLI中，关联的值类类型为基本类型添加了重要的附加功能。编译器在需要时，将安排原值与关联类型之间的自动转换，其中从原值转换为关联类型成为装箱(boxing)，反之称为拆箱(unboxing)。根据上下文环境，这些变量将表现为简单的值或者对象。 </font> </p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于ISO/ANSI C++基本类型的名称是C++/CLI程序中值类类型名称的别名，所以原则上C++/CLI代码中可用任何一种名称。 </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><strong><font face="Tahoma" size="1">int count = 10; </font></strong></p>
            <p><strong><font face="Tahoma" size="1">double value = 2.5;</font></strong></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与下面的代码是等价的 </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font size="1"><font face="Tahoma"><strong>System::Int32 count = 10;</strong> </font></font> </p>
            <p><strong><font face="Tahoma" size="1">System::Double value = 2.5;</font></strong></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp; 上面2种代码是完全合法的，但应尽量使用基本类型名称，如int和double，而不是System::Int32和System::Double。这是因为上面描述的这种映射关系仅适用于Visual C++ 2005及以上版本的编译器，其他版本编译器未必实现这种映射关系。 </font> </p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将基本类型转换为值类类型是C++/CLI的一个重要特征。在ISO/ANSI C++中基本类型与类类型完全不同，而在C++/CLI中，所有数据都以类类型的形式存储，包括值类型（存储在堆栈上）和引用类型（存储在堆上）2种。 </font> </p>
<p><font size="1"><font face="Tahoma"><em><u>例子：Fruit CLR控制台项目</u></em> </font></font> </p>
<p><font size="1"><font face="Tahoma"><em>在Visual Studio 2005中创建CLR Console Application项目，输入名称Ex2_12，将生成如下文件</em> </font></font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">// Ex2_12.cpp : main project file. </font> </p>
            <p><font face="Tahoma" size="1">#include "stdafx.h" </font> </p>
            <p><font face="Tahoma" size="1">using namespace System; </font> </p>
            <p><font face="Tahoma" size="1">int main(array&lt;System::String ^&gt; ^args) </font> </p>
            <p><font face="Tahoma" size="1">{ </font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; Console::WriteLine(L"Hello World"); </font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; return 0; </font> </p>
            <p><font face="Tahoma" size="1">}</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font size="1"><font face="Tahoma"><em>main函数后的参数为命令行参数。然后按如下方式改写代码</em> </font></font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">// Ex2_12.cpp : main project file. </font> </p>
            <p><font face="Tahoma" size="1">#include "stdafx.h" </font> </p>
            <p><font face="Tahoma" size="1">using namespace System; </font> </p>
            <p><font face="Tahoma" size="1">int main(array&lt;System::String ^&gt; ^args) </font> </p>
            <p><font face="Tahoma" size="1">{ </font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; int apples, oranges;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; int fruit;</strong> </font></font> </p>
            <p><strong><font face="Tahoma" size="1"></font></strong> </p>
            <p><strong><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; apples = 5; </font></strong> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; oranges = 6;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; fruit = apples + oranges;</strong> </font></font> </p>
            <p><strong><font face="Tahoma" size="1"></font></strong> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Console::WriteLine(L"\nOranges are not the only fruit ...");;;;;;;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Console::Write(L"- and we have ");</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Console::Write(fruit);</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Console::Write(L" fruit in all.\n");</strong> </font></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; return 0; </font> </p>
            <p><font face="Tahoma" size="1">}</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font size="1"><font face="Tahoma"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 新加行用粗体字显示，编译后执行得到如下输出：</em> </font></font> </p>
<p><font size="1"><font face="Tahoma"><em>Oranges are not the only fruit&#8230;</em> </font></font> </p>
<p><font size="1"><font face="Tahoma"><em>- and we have 11 fuit in all.</em> </font></font> </p>
<p><font size="1"><font face="Tahoma"><em><u>例子说明</u></em> </font></font> </p>
<p><font size="1"><font face="Tahoma"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与ISO/ANSI C++版本比较，变量的类型int将成为C++/CLI类型System::Int32。如果用System::Int32替换代码中的int，然后重新编译运行，结果将没有变化。</em> </font></font> </p>
<p><font size="1"><font face="Tahoma"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteLine()函数为C++/CLI函数，定义在System命名空间的Console类中。Console表示标准输入输出流。Write()函数为该类的另一个输出函数，不会自动换行。下面专门讨论C++/CLI的控制台输入输出。</em> </font></font> </p>
<h4><font face="黑体" size="2">二、控制台输出</font></h4>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C++/CLI中特有控制台格式化输出功能，例如可用下面的代码来输出字符串与变量混合文本。 </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">Console::WriteLine(L"There are {0} fruit.", fruit);</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console::WriteLine()的第一个参数是L&#8221;There are {0} fruit.&#8221;，其中{0}为格式化占位符，表示在此处插入第二个参数的值，如果有更多需要插入的参数，则该参数对应的占位符编号继续增加：{1}、{2}、{3}&#8230;。在第一个字符串参数中，编号的顺序可以颠倒，如 </font>
<table border="1" cellpadding="0" cellspacing="0" width="752">
    <tbody>
        <tr>
            <td valign="top" width="750">
            <p><font face="Tahoma" size="1">Console::WriteLine(L"There are {1} packages weighting {0} pounds", packageWeight, packageCount);</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式化占位符还可以控制显示的格式，如{1:F2}表示第2个参数显示成有2位小数的浮点数，冒号后的为格式规范 </font>
<table border="1" cellpadding="0" cellspacing="0" width="797">
    <tbody>
        <tr>
            <td valign="top" width="795">
            <p><font face="Tahoma" size="1">Console::WriteLine(L"There are {0} packages weighting {1：F2} pounds ", packageCount, packageWeight);</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp; 输出为 </font> </p>
<p><font face="Tahoma" size="1">There are 25 packages weighting 7.50 pounds. </font> </p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般说来，可以编写格式为{n,w:Axx}的格式规范，其中n为索引值，用于选择逗号后的第几个参数； A为单个字母，表示如何对变量格式化；xx为1个或2个数字，指定参数的精度；w为有符号整数，表示可选的字段宽度范围，如果w为+，则字段右对齐，如果w为-，则左对齐。如果数值的位置数小于w指定的位置数，则多出来的用空格填充，如果数值的位置数大于w指定的位置数，则忽略w的限定： </font>
<table border="1" cellpadding="0" cellspacing="0" width="797">
    <tbody>
        <tr>
            <td valign="top" width="795">
            <p><font face="Tahoma" size="1">Console::WriteLine(L"Packages: {0,3} Weight: {1,5：F2} pounds ", packageCount, packageWeight);</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出为（下划线表示空格填充位）： </font> </p>
<p><font face="Tahoma" size="1">Packages: _25 Weight: __7.50 pounds </font> </p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可选的格式说明符如表3所示</font></p>
<p align="center"><font face="Tahoma" size="1">表3</font></p>
<p align="center">
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="149">
            <p><font size="1"><font face="Tahoma"><strong>格式说明符</strong><strong></strong></font></font></p>
            </td>
            <td valign="top" width="515">
            <p><font size="1"><font face="Tahoma"><strong>说</strong><strong> </strong><strong>明</strong><strong></strong></font></font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="149">
            <p><font face="Tahoma" size="1">C或c</font></p>
            </td>
            <td valign="top" width="515">
            <p align="left"><font face="Tahoma" size="1">把值作为货币量输出</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="149">
            <p><font face="Tahoma" size="1">D或d</font></p>
            </td>
            <td valign="top" width="515">
            <p align="left"><font face="Tahoma" size="1">把整数作为十进制值输出。如果指定的精度大于位数，则在数值的坐标填充0</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="149">
            <p><font face="Tahoma" size="1">E或e</font></p>
            </td>
            <td valign="top" width="515">
            <p align="left"><font face="Tahoma" size="1">按照科学技术法输出浮点值</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="149">
            <p><font face="Tahoma" size="1">F或f</font></p>
            </td>
            <td valign="top" width="515">
            <p align="left"><font face="Tahoma" size="1">把浮点数作为&#177;####.##的定点数输出</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="149">
            <p><font face="Tahoma" size="1">G或g</font></p>
            </td>
            <td valign="top" width="515">
            <p align="left"><font face="Tahoma" size="1">以最紧凑的形式输出，取决于是否指定了精度值，如果没有则适用默认精度</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="149">
            <p><font face="Tahoma" size="1">N或n</font></p>
            </td>
            <td valign="top" width="515">
            <p align="left"><font face="Tahoma" size="1">把值作为定点十进制值输出，必要时以3位一组用逗号分隔</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="149">
            <p><font face="Tahoma" size="1">X或x</font></p>
            </td>
            <td valign="top" width="515">
            <p align="left"><font face="Tahoma" size="1">把整数作为十六进制值输出。根据X或x，以大写或小写输出。</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong><font face="Tahoma" size="1"></font></strong> </p>
<p><font size="1"><font face="Tahoma"><u><em>例子：计算地毯价格，演示CLR控制台程序的格式化输出</em></u> </font></font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">// Ex2_13.cpp : main project file. </font> </p>
            <p><font face="Tahoma" size="1">#include "stdafx.h" </font> </p>
            <p><font face="Tahoma" size="1">using namespace System; </font> </p>
            <p><font face="Tahoma" size="1">int main(array&lt;System::String ^&gt; ^args) </font> </p>
            <p><font face="Tahoma" size="1">{ </font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; double carpetPriceSqYd = 27.95;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; double roomWidth = 13.5; // in feet</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; double roomLength = 24.75; // in feet</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; const int feetPerYard = 3;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; double roomWidthYard = roomWidth/feetPerYard;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; double roomLengthYard = roomLength/feetPerYard;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; double carpetPrice = roomWidthYard*roomLengthYard*carpetPriceSqYd;</strong> </font></font> </p>
            <p><strong><font face="Tahoma" size="1"></font></strong> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Console::WriteLine(L"Room is {0:F2} yards by {1:F2} yards",</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; roomWidthYard, roomLengthYard);</strong> </font></font> </p>
            <p><strong><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; Console::WriteLine(L"Room area is {0:F2} square yards", </font></strong> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; roomWidthYard*roomLengthYard);</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Console::WriteLine(L"Carpet price is ${0:F2}", carpetPrice);</strong> </font></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; return 0; </font> </p>
            <p><font face="Tahoma" size="1">}</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font size="1"><font face="Tahoma"><u><em>例子说明：</em></u><u><em>（略）</em></u> </font></font> </p>
<p><strong><font face="Tahoma" size="1"></font></strong> </p>
<h4><font face="黑体" size="2">三、控制台输入</font></h4>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Net Framework的控制台键盘输入功能有限，可以适用Console::ReadLine()函数把整行输入作为字符串读取，或者使用Console::Read()读取单个字符，还可以适用Console::ReadKey()读取按键。ReadLine()的例子如下： </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">String^ line = Console::ReadLine();</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于将整行文本存入字符串中，按下Enter键时，文本结束。变量line为String^型，表示String数据类型的引用，line为Console::ReadLine()函数读入字符串的引用。Read()的例子如下： </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">char ch = Console::Read();</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于逐字符的读入输入数据，并将其转换成对应的数字值。ReadKey的例子如下： </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">ConsoleKeyInfo keyPressed = Console::ReadKey(true);</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于读取按键值，并返回ConsoleKeyInfo对象，该为对象定义在System命名空间中的值类型。参数true表示按键不在命令行上显示出来，false则表示显示按键回显。按键对应的字符可用ConsoleKeyInfo对象的KeyChar得到。 </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">Console::WriteLine(L&#8221;The key press corresponds to the character: {0}&#8221;, keyPress.KeyChar);</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按键对应的键值由ConsoleKeyInfo对象的Key得到。 </font> </p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 尽管C++/CLI控制台程序中不能格式化输入，但输入一般都通过窗口组件得到，因此这仅仅是一个小缺陷。 </font> </p>
<h4><font face="黑体" size="2">四、强制类型转换safe_cast</font></h4>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在CLR环境中safe_cast用于显示的强制类型转换。safe_cast用于将一种类型转换为另一种类型，在不成功时能够抛出异常，因此在C++/CLI中使用safe_cast是比较好的选择。其用法和static_cast一样： </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">double value1 = 10.5; </font> </p>
            <p><font face="Tahoma" size="1">double value2 = 15.5; </font> </p>
            <p><font face="Tahoma" size="1">int whole_number = safe_cast&lt;int&gt;(value1) + safe_cast&lt;int&gt;(value2);</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<h4><font face="黑体" size="2">五、枚举</font></h4>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C++/CLI的枚举与ISO/ANSI C++有较大的区别。下例为C++/CLI中的一个枚举类型： </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">enum class Suit {Clubs, Diamonds, Hearts, Spades};</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp; 该语句定义了一个枚举类型Suit，该类型的变量只能被赋值枚举定义中的值，且必须用枚举类型名称限定枚举常数。 </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">Suit suit = Suit::Diamonds;</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意class关键字跟在enum之后。说明该枚举类型为C++/CLI，该关键字还表明在定义中规定的常量: Clubs\Diamonds\Hearts\Spades都是类对象而非ISO/ANSI C++中的基本类型（整型）值。实际上，默认情况下这些都是Int32类型的对象。 </font> </p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于C++/CLI枚举定义中的变量都是类对象，因此不能在函数内部定义。</font></p>
<p><u><em><font face="Tahoma" size="1">例子</font></em></u></p>
<p>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">// Ex2_14.cpp : main project file. </font> </p>
            <p><font face="Tahoma" size="1">#include "stdafx.h" </font> </p>
            <p><font face="Tahoma" size="1">using namespace System; </font> </p>
            <p><font size="1"><font face="Tahoma"><strong>enum</strong><strong> class Suit {Clubs, Diamonds, Hearts, Spades};</strong> </font></font> </p>
            <p><font face="Tahoma" size="1">int main(array&lt;System::String ^&gt; ^args) </font> </p>
            <p><font face="Tahoma" size="1">{ </font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Suit suit = Suit::Clubs;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; int value = safe_cast&lt;int&gt;(suit);</strong> </font></font> </p>
            <p><strong><font face="Tahoma" size="1"></font></strong> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Console::WriteLine(L"Suit is {0} and the value is {1}", suit, value);</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; suit = Suit::Diamonds;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; value = safe_cast&lt;int&gt;(suit);</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Console::WriteLine(L"Suit is {0} and the value is {1}", suit, value);</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; suit = Suit::Hearts;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; value = safe_cast&lt;int&gt;(suit);</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Console::WriteLine(L"Suit is {0} and the value is {1}", suit, value);</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; suit = Suit::Spades;</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; value = safe_cast&lt;int&gt;(suit);</strong> </font></font> </p>
            <p><font size="1"><font face="Tahoma"><strong>&nbsp;&nbsp;&nbsp; Console::WriteLine(L"Suit is {0} and the value is {1}", suit, value);</strong> </font></font> </p>
            <p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp; return 0; </font> </p>
            <p><font size="1"><font face="Tahoma">}<strong></strong></font></font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font size="1"><font face="Tahoma"><em>该例子的输出为</em> </font></font> </p>
<p><font face="Tahoma" size="1">Suit is Clubs and the value is 0 </font> </p>
<p><font face="Tahoma" size="1">Suit is Diamonds and the value is 1 </font> </p>
<p><font face="Tahoma" size="1">Suit is Hearts and the value is 2 </font> </p>
<p><font face="Tahoma" size="1">Suit is Spades and the value is 3 </font> </p>
<p><font size="1"><font face="Tahoma"><u><em>例子说明</em></u> </font></font> </p>
<p><font size="1"><font face="Tahoma"><em>1． Suit为枚举类型，不能在函数main()内部定义，因此只能定义为全局作用域内。</em> </font></font> </p>
<p><font size="1"><font face="Tahoma"><em>2． 必须用类型名称Suit限定枚举常量，如Suit::Clubs，否则编译器将无法识别。</em> </font></font> </p>
<p><font size="1"><font face="Tahoma"><em>3． 变量suit的值为类对象，要获取其值必须显示的将其转换成int类型。</em> </font></font> </p>
<p><font face="黑体" size="1">(一）指定枚举常量的类型</font></p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 枚举中常量的类型可以是下表中任一基本类型： </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="115">
            <p><font face="Tahoma" size="1">short</font></p>
            </td>
            <td valign="top" width="100">
            <p><font face="Tahoma" size="1">int</font></p>
            </td>
            <td valign="top" width="113">
            <p><font face="Tahoma" size="1">long</font></p>
            </td>
            <td valign="top" width="142">
            <p><font face="Tahoma" size="1">long long</font></p>
            </td>
            <td valign="top" width="113">
            <p><font face="Tahoma" size="1">signed char</font></p>
            </td>
            <td valign="top" width="80">
            <p><font face="Tahoma" size="1">char</font></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="115">
            <p><font face="Tahoma" size="1">unsigned short</font></p>
            </td>
            <td valign="top" width="100">
            <p><font face="Tahoma" size="1">unsigned int</font></p>
            </td>
            <td valign="top" width="113">
            <p><font face="Tahoma" size="1">unsigned long</font></p>
            </td>
            <td valign="top" width="142">
            <p><font face="Tahoma" size="1">unsigned long long</font></p>
            </td>
            <td valign="top" width="113">
            <p><font face="Tahoma" size="1">unsigned char</font></p>
            </td>
            <td valign="top" width="80">
            <p><font face="Tahoma" size="1">bool</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要指定一个枚举常量的类型，可以在枚举类型名称之后写入常量类型名称（要用冒号隔开），如下例所示： </font>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="664">
            <p><font face="Tahoma" size="1">enum class Face:char { Ace,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten,Jack,Queen,King};</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此枚举类型中的常量为Char类型，对应的基本类型为char。其中第一个常量默认情况下对应于代码值0，后面的依次递增。 </font> </p>
<p><font face="黑体" size="1">(二)指定枚举常量的值</font></p>
<p><font face="Tahoma" size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以赋予枚举类型定义中的一个或全部常数对应的值，如 </font>
<table border="1" cellpadding="0" cellspacing="0" width="740">
    <tbody>
        <tr>
            <td valign="top" width="738">
            <p><font face="Tahoma" size="1">enum class Face:char { Ace=1,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten,Jack,Queen,King};</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1">这使得Ace获得1，Two获得2，其余依此类推，直到King=13。如果想让Ace获得最大值，则可以如下定义： </font>
<table border="1" cellpadding="0" cellspacing="0" width="740">
    <tbody>
        <tr>
            <td valign="top" width="738">
            <p><font face="Tahoma" size="1">enum class Face:Char { Ace=14,Two=2,Three,Four,Five,Six,Seven,Eight,Nine,Ten,Jack,Queen,King};</font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><font face="Tahoma" size="1"></font></p><img src ="http://www.cppblog.com/golq/aggbug/88644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/golq/" target="_blank">英勇的近卫军</a> 2009-06-27 16:27 <a href="http://www.cppblog.com/golq/archive/2009/06/27/88644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>