知识大全 C++/CLI基本数据类型探索

Posted 函数

篇首语:与其担心未来,不如现在好好努力,只有奋斗才能给你安全感。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C++/CLI基本数据类型探索相关的知识,希望对你有一定的参考价值。

C++/CLI基本数据类型探索  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  C++/CLI所支持的基本类型 例如int double bool等 在某些方面可以说是沿袭了ISO C++中的类型——同样的用法会在C++/CLI中得到同样的结果 例如加法或者赋值操作 但是C++/CLI也为这些基本类型引入了一些新的东西     在通用类型系统(CTS)中 每一个基本类型都在System命名空间中存在一个对应的类(见表 ) 例如int实际上完全等价于System::Int 我们可以使用二者中的任何一个来声明一个整数     int ival = ;  Int ival = ;    出于移植性的考虑 在使用这些基本类型时 我们推荐大家使用内建的关键词 而非System命名空间中的类名    >   >    对于System命名空间中类的公有静态成员 我们既可以通过内建的关键字 也可以通过System命名空间中的类名来访问 例如 为了获取一个数值类型的取值范围 我们可以直接使用内建的关键字来访问其静态属性MaxValue和MinValue     int imaxval = int::MaxValue;  int iminval = Int ::MinValue;    每个数值类型都支持一个名为Parse的成员函数 用以将一个字符串转化为其所表示的数值 例如 给定下面的字符串     String^ bonus = $ ;    调用Parse会将myBonus初始化为     double myBonus = double::Parse( bonus ns );    其中ns表示对一些NumberStyles枚举类型取位或(biise 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() ToInt () ToDateTime()等:    int ival = Convert::ToInt ( myBonus );    两种转换方法采用的策略有所不同 显式转型会直接对小数部分进行截断 而Convert的成员函数则采用的是舍入算法 例如上面的例子中ival赋值后的结果为 而ival 赋值后的结果为     我们还可以直接使用字面常量(literal)来调用其对应类型的成员函数 虽然这乍看起来有些怪异 例如 我们可以编写如下代码     Console::Write( : ( ) ToString() );    其中( ) ToString()返回的是字面常量整数 的字符串表示 注意 外面的圆括号是必须的 因为它会使得编译器将后面的成员选择操作符点号绑定到整数 上 而不是将 解析为一个double类型的字面常量——那样的话 后面的ToString()将变得不合法 为什么我们有时候需要这样做呢?一种可能的情况是将一个字符串传递给Console的成员函数要比传递实际的数值来的更加高效     对于字符以及字符串这样的字面常量 我们也可以像上面的整数一样调用它们的成员函数 但是它们的行为有一点点晦涩 例如 下面的代码     Console::WriteLine(( a ) ToString() );    将在控制台上打印出 而非 a 这个字符 要将字符 a 打印出来 我们需要将其首先转型为System::Char     Console::WriteLine(((wchar_t) a ) ToString() );    C++/CLI对字符串字面常量采取了特殊的处理策略 从某种程度上来讲 字符串字面常量在C++/CLI中的类型更接近System::String 而非C风格的字符串指针 显然 这将对重载函数的辨析产生影响 例如     public ref class R   public:  void foo( System::String^ ); // ( )  void foo( std::string ); // ( )  void foo( const char* ); // ( )  ;    void bar( R^ r )    // 调用哪一个foo呢?  r >foo( Pooh );      在ISO C++中 这将被辨析为第 个foo() 因为字符串字面常量更接近const char* 而非ISO C++标准库中的string类型 但是 在C++/CLI中 上面的调用将被辨析为第 个foo() 因为现在字符串字面常量被认为更接近System::String 而非字符指针 要理解其中的缘由 让我们往后退两步 先来看看ISO C++和C++/CLI如何辨析一个重载函数 然后再来看ISO C++和C++/CLI如何辨析一个字符串字面常量     一个重载函数的辨析过程通常包含以下三个步骤      .选择候选函数集合 候选函数是指那些从词法范畴来看与所调用函数名相匹配的函数 例如 由于我们上面是在R的一个实例上调用foo() 所以所有名称为foo但却不是R或者其基类的成员的那些函数将不被认为是候选函数 这样看来 我们现在有三个候选函数 即R中三个名称为foo的成员函数 如果这个阶段得到的候选函数集合为空 那么调用将告失败      .从候选函数集合中选择可用函数集合 可用函数是指函数声明时的参数个数和它们的类型与调用时所指定的相匹配的那些函数 在我们上面的例子中 三个候选函数都是可用函数 如果这个阶段得到的可用函数集合为空 那么调用也将失败      .从可用函数集合中选择最匹配的函数 这个阶段将会对实际传递的参数和可用函数所声明的参数之间的转换进行一个排名 对于只含一个参数的函数来说 这个过程比较简单 但是对于含有多个参数的函数来说 这个过程就变得相对有些复杂 如果没有一个最佳的匹配函数胜出 那么调用将告失败 也就是说各个可用函数的参数类型到实际参数类型之间的转换被认为一样的好 换言之多个调用之间产生了混淆     那么现在摆在我们面前有两个问题 ( )我们实际传递的参数 Pooh 到底是什么类型?( )在判定类型转换的优劣时采用的是什么算法?    在ISO C++中 字符串字面常量 Pooh 的类型为const char[ ]——注意 在字符串字面常量后面有一个隐含的截断字符null 在上面的例子中显然不存在这样的精确匹配 因此必须应用某种形式的类型转换 这样 两个ISO C++候选函数( )和( )将进行竞争     void foo( std::string ); // ( )  void foo( const char* ); // ( )    那么编译器如何从中判断可用函数呢?C++语言对类型转换按照优先顺序定义有一个层级结构 在这个结构中 如果一种转换优于另一种转换 那么它将被排在前面 在C++/CLI中 我们将CLI类型的行为也集成到了ISO C++的标准类型转换层级结构中 下面是对集成之后的层级结构的一个描述      )精确匹配是最好的 需要注意的是精确匹配并不意味着实际传递的参数类型和函数声明的形式参数类型完全匹配 它们只需要 足够接近 就可以了 我们下面将会看到 足够接近 对于ISO C++和C++/CLI中的字符串字面常量有着一些不同的含义      )在标准转换中 拓宽转换要优于非拓宽转换 例如 将short拓宽为int要优于将int转换为double      )标准转换优于装箱(boxing)转换 例如 将int转换为double优于将int装箱为Object      )装箱转换优于用户自定义的隐式转换      )用户自定义的隐式转换优于没有任何转换!     )否则 用户必须使用显式的转型符号来表示期望的转换     对于上面两个ISO C++下的候选函数 将字符串字面常量转换为一个std::string属于上面第 条 即隐式调用string的构造器来创建一个临时string对象 而将字符串字面常量转换为一个const char* 属于上面第 条 第 条优于第 条 因此 参数为const char*的那个函数在这场竞争中胜出     这种归属在第 条 精确匹配 下的trivial conversions实际上在技术的定义上是很严格的 总共有 种这样的trivial conversions可以被归为精确匹配 即使在这 种trivial conversions中 为了规范语言对类型的选择 它们也有一个优先级的排序     大多数读者和程序员可能对于这样的细节没有多大兴趣 并且通常情况下我们也无须深入到这些细节的地方 但是如果我们要得到一个直观的语言行为 并且确保它们在不同的实现上表现相同 这些规则的存在就很有必要 这是因为作为一门编程语言 它的行为一般要具有某种程度的 类型感知 能力 从而允许程序员忽略这些细节 下面让我们来对这 种trivial conversions做一简单的了解 其中 种被称为左值转换(lvalue transformation) 左值(lvalue)是一个可寻址的 可被执行写操作的程序实体 第 种为限定性转换(qualification conversion) 例如 在一个类型声明上加一个const修饰符就属于这种转换 其中 种左值转换优于限定性转换     在我们上面的例子中 由本地数组到指针的转换 即由const char [ ]到const char * 就是一种左值转换 在大多数情况下 我们甚至不将这看作一种转换     这种形式的左值转换在C++/CLI中仍然适用 但是在我们将System::String类引入之后 字符串字面常量到const char*的转换就不再是最好的匹配了 实际上 在C++/CLI中 Pooh 这样的字符串字面常量的类型既是const char[ cha138/Article/program/ASP/201311/21784

相关参考

知识大全 探索用户自定义数据类型

SQL技巧:探索用户自定义数据类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  用户自定义数据

知识大全 c语言的基本数据类型都有什么,麻烦知道用大括号分类,非常感谢

c语言的基本数据类型都有什么,麻烦知道用大括号分类,非常感谢C语言中的基本数据类型,是C语言自己定义好的数据类型,用户直接拿来就可以使用的。它包括:整型int字符型char浮点型float(双精度do

知识大全 实例解析C++/CLI之代理与事件

实例解析C++/CLI之代理与事件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在C++/CLI中

知识大全 实例解析C++/CLI之静态构造函数

实例解析C++/CLI之静态构造函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!就某些类而言当在

知识大全 C++/CLI中有效使用非托管并列缓存

C++/CLI中有效使用非托管并列缓存  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!VisualS

知识大全 超越C++下一代C++ —C++/CLI简介

超越C++下一代C++—C++/CLI简介  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一绪论  

知识大全 什么叫实型数据

什么叫实型数据?是C语言中的数据类型,数据类型分为基本整型、构造类型、指针类型、空类型。基本类型又分为整型、实型、字符型、枚举类型。实型数据就是加了小数点的数(也称浮点数类型)。顺便也说一下整型,整型

《会计信息化发展规划(2021—2025年)》提出,要提升会计数据的( ),探索形成服务价值创造的会计数据要素。

会计改革与发展十四五规划题目:《会计信息化发展规划(2021—2025年)》提出,要提升会计数据的(),探索形成服务价值创造的会计数据要素。A、创造性B、价值C、质量D、可用性参考答案:BCD

《会计信息化发展规划(2021—2025年)》提出,要提升会计数据的( ),探索形成服务价值创造的会计数据要素。

会计改革与发展十四五规划题目:《会计信息化发展规划(2021—2025年)》提出,要提升会计数据的(),探索形成服务价值创造的会计数据要素。A、可用性B、创造性C、价值D、质量参考答案:ACD

知识大全 扩展方法 之 基本数据篇

  C#中有两种基本数据类型值类型和引用类型值类型包括简单类型结构类型枚举类型引用类型包括Object类型类类型接口代表元字符串类型数组    说白了这篇就是扩展intstringdoubleDate