其他话题
以下的话题非常简短、但却十分有帮助:
1、前面也提到,const不是很适合CLI,且在引用类中,C++/CLI也不允许用const(或volatile)来限定成员函数;但个关键字可用在某些类中实例构造函数或成员函数上。那么在此情况下,它的类型到底是什么呢?对本地类型N来说,它是N* const;然而,对一个引用类R来说,它只是一个R^。虽然句柄不是const限定的,但它的值却不能被修改。
2、Point::ToString的实现使用了如下形式:
return String::Concat("(", X, ",", Y, ")"); |
另外也可以像下面这样写:
return String::Format("({0},{1})", X, Y); |
正如它的名字,Format函数允许对文本进行格式化(如前导的空格或零、或者一些分隔符等等),而不是简单地对字符串进行连接。
3、如果想要知道编译器是否支持C++/CLI扩展,可测试__cplusplus_cli宏是否已经预定义。如果已定义,它的值将为200406L。
4、CLI库包含了一个称为System::Decimal的类型,其至少可表示28位数字的值,这个类型是专为那些需要在没有四舍五入情况下进行大数额金融计算而准备的。与浮点类型不同,Decimal的小数部分能表示得更加精确,通常,当某数以浮点类型表示时,其经常会有一个无穷的小数,但却更容易导致舍入上的错误;而Decimal有一个称为"scale(数值范围)"的属性,其代表了十进制下所需的位数。举例来说,2.340的scale为3,其结尾的0非常重要,当两个十进制数相加或相减时,结果的数值范围是两者数值范围中较大的一者,如:1.0 + 2.000为3.000,而5.0-2.00为 3.00;当两个十进制数相乘时,结果的数值范围是两者数值范围之和,如:1.0*2.000为2.0000;当两个十进制相除时,结果的数值范围是除数的数值范围比被除数多出的值,如:4.00000/2.000为2.00。然而,数值范围不可能小于为表示正确的值所需的范围,例如,3.000/2.000、3.00/2.000、3.0/2.000和3/2都是1.5,下面是Decimal的使用范例:
Decimal x = Decimal::Parse("23.00"); Decimal y = Decimal::Parse("2.000"); Decimal result = x * y + Decimal::Parse("2.5"); Console::WriteLine(result); |
输出为48.50000。请注意,C++/CLI没有字面意义上的Decimal类型,所以需要使用Parse函数。
5、如果有这样一种情况,一个类使用了C++/CLI之外的其他语言编写,且有一个名字为C++/CLI关键字的public成员,那就可通过__identifier(x)这种形式的内部函数来访问它,此处的x可以是一个标识符、一个关键字、或一个字面上的字符串,例如,为调用一个类X中名为delete、且没有参数的静态函数,就可以像X::__identifier(delete)()这样使用。
6、一个literal域是一个定义在类中的命名编译期常量,同样,它也必须有接受一个常量值的初始化程序。尽管一个literal域使用上像一个静态数据成员,但它并不能声明为static,且编译器会把每个literal域都替换为域值。一个literal域能有任意标量类型,但是,能用作初始化句柄的唯一常量数值,只能为字面上的字符串和nullptr。
literal double PI = 3.1415926; literal int MinValue = -10, MaxValue = 10; literal int Range = MaxValue - MinValue + 1; enum Direction {North, South, East, West}; literal Direction Home = North; literal System::String^ Title = "Annual Report"; |
查看本文来源