C++/CLI基本数据类型探索
c++/cli所支持的基本类型,例如int、double、bool等,在某些方面可以说是沿袭了iso-c++中的类型――同样的用法会在c++/cli中得到同样的结果,例如加法或者赋值操作。但是c++/cli也为这些基本类型引入了一些新的东西。
在通用类型系统(cts)中,每一个基本类型都在system命名空间中存在一个对应的类(见表1)。例如int实际上完全等价于system::int32。我们可以使用二者中的任何一个来声明一个整数:
int ival = 0;
int32 ival2 = 0;
出于移植性的考虑,在使用这些基本类型时,我们推荐大家使用内建的关键词,而非system命名空间中的类名。
(www.iocblog.net 文章来源)
对于system命名空间中类的公有静态成员,我们既可以通过内建的关键字,也可以通过system命名空间中的类名来访问。例如,为了获取一个数值类型的取值范围,我们可以直接使用内建的关键字来访问其静态属性maxvalue和minvalue。
int imaxval = int::maxvalue;
int iminval = int32::minvalue;
每个数值类型都支持一个名为parse的成员函数,用以将一个字符串转化为其所表示的数值。例如,给定下面的字符串:
string^ bonus = "$ 12,000.79";
调用parse会将mybonus初始化为12000.79:
double mybonus = double::parse( bonus, ns );
其中ns表示对一些numberstyles枚举类型取位或(bitwise or)运算的结果。numberstyles是位于system::globalization命名空间中的一个枚举类型,用于表征对空白、货币符号、小数点或者逗号等的处理。看下面的代码:
using namespace system;
using namespace system::globalization;
double bonusstring( string^ bonus )
{
numberstyles ns = numberstyles::allowleadingwhite;
ns |= numberstyles::allowcurrencysymbol;
ns |= numberstyles::allowthousands;
ns |= numberstyles::allowdecimalpoint;
return double::parse( bonus, ns );
}
我们也可以使用转型符号来在类型间进行显式的转换。
int ival = ( int ) mybonus;
或者使用system::convert类的一些转换方法,例如todouble(), toint32(), todatetime()等:
int ival2 = convert::toint32( mybonus );
两种转换方法采用的策略有所不同:显式转型会直接对小数部分进行截断,而convert的成员函数则采用的是舍入算法。例如上面的例子中ival赋值后的结果为12000,而ival2赋值后的结果为12001。
我们还可以直接使用字面常量(literal)来调用其对应类型的成员函数,虽然这乍看起来有些怪异。例如,我们可以编写如下代码:
console::write( "{0} : ", ( 5 ).tostring() );
其中( 5 ).tostring()返回的是字面常量整数5的字符串表示。注意5外面的圆括号是必须的,因为它会使得编译器将后面的成员选择操作符点号绑定到整数5上,而不是将'5.'解析为一个double类型的字面常量――那样的话,后面的tostring()将变得不合法。为什么我们有时候需要这样做呢?一种可能的情况是将一个字符串传递给console的成员函数要比传递实际的数值来的更加高效。
对于字符以及字符串这样的字面常量,我们也可以像上面的整数一样调用它们的成员函数,但是它们的行为有一点点晦涩。例如,下面的代码:
console::writeline(( 'a' ).tostring() );
将在控制台上打印出97,而非'a'这个字符。要将字符'a'打印出来,我们需要将其首先转型为system::char:
console::writeline(((wchar_t)'a').tostring() );
(www.iocblog.net 文章来源)
c++/cli对字符串字面常量采取了特殊的处理策略。从某种程度上来讲,字符串字面常量在c++/cli中的类型更接近system::string,而非c风格的字符串指针。显然,这将对重载函数的辨析产生影响。例如:
public ref class r {
public:
void foo( system::string^ ); // (1)
void foo( std::string ); // (2)
void foo( const char* ); // (3)
};
void bar( r^ r )
{
// 调用哪一个foo呢?
r->foo( "pooh" );
}
Tag: CLI
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。