C++/CLI基本数据类型探索

分类: VC.NET   出处:iocblog整理  更新时间:2008-10-08   添加到收藏  


  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 文章来源)


  

表1 基本类型和它们在system命名空间中对应的类


  
  对于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" );
  }
  

[1] [2] 下一页


Tag: CLI



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。