资源描述
C++/CLI 学习入门(一):基础
从今日开始,将前期学习《Visual C++ 2005 入门经典》(Ivor Horton 著 清华大学出版
社出版)的相关笔记整理到随笔中,希望能和 C++/CLI 爱好者分享学习过程中的心得。文中主
要内容和例子摘自原书相关章节,如有侵权,请留言或来信告知。
相比于 ISO/ANSI C++而言,C++/CLI 进行了大量的扩充,并且提供了大量的附加功能。
主要包括:
• 在 C++/CLI 程序中,所有 ISO/ANSI 基本数据类型都可以使用,但在一些特
殊的上下文环境中,它们具有一些额外属性;
• 在控制台程序中,C++/CLI 对键盘和命令行输出提供了自己的机制;
• C++/CLI 中引入了 safe_cast 运算符,确保强制类型转换操作能够生成可检
验的代码;
• C++/CLI 提供了另外一种基于类的枚举功能,其灵活性超过了 ISO/ANSI C
++中的 enum 声明。
一、基本数据类型
C++/CLI 中包括了所有 ISO/ASNI C++中的基本数据类型,算术运算也和本地 C++完全
一样。除此之外,C++/CLI 中还定义了 2 种整数类型,如表 1 所示:
表 1:C++/CLI 新增基本数据类型
类型 字节 值域
long long 8 从-9223372036854775808 到 9223372036854775807
Unsigned long long 8 从 0 到 18446744073709551615
指定 long long 数据类型时,需要在整数数值后面加 LL 或小写字母 ll,如
longlong big = 123456789LL;
指定 unsinged long long 类型时,需要在整数数值后面加 ULL 或小写字母 ull,如
unsigned long long huge = 123456789LL;
在 C++/CLI 中,每一个 ISO/ANSI C++基本类型名称都映射到 System 命名空间中定义的
值类类型。在 C++/CLI 程序中,ISO/ANSI C++基本类型名称都是 CLI 中对应值类类型的简略
形式。表 2 给出了基本类型、占用内存以及对应的值类类型。
表 2:基本类型与 CLI 值类型
基本类型
bool
char
singed char
unsigned char
short
unsigned short
int
unsigned int
long
unsigned long
long long
unsigned long long
float
double
long double
wchar_t
字节
1
1
1
1
2
2
4
4
4
4
8
8
4
8
8
2
CLI 值类类型
System::Boolean
System::SByte
System::SByte
System::Byte
System::Int16
System::UInt16
System::Int32
System::UInt32
System::Int32
System::UInt32
System::Int64
System::UInt64
System::Single
System::Double
System::Double
System::Char
默认情况下,char 类型被视为 singed char,因此其关联的值类类型为 System::SByte。如
果编译选项/J,则 char 默认为 unsigned char,此时关联为 System::Byte。System 为根命名空
间名,C++/CLI 的值类类型在这个空间中定义。此外 System 空间中还定义了许多其他类型,如
表示字符串的 String 类型、精确存储的十进制小数类型 Decimal 等等。
在 C++/CLI 中,关联的值类类型为基本类型添加了重要的附加功能。编译器在需要时,将
安排原值与关联类型之间的自动转换,其中从原值转换为关联类型成为装箱(boxing),反之称为
拆箱(unboxing)。根据上下文环境,这些变量将表现为简单的值或者对象。
由于 ISO/ANSI C++基本类型的名称是 C++/CLI 程序中值类类型名称的别名,所以原则
上 C++/CLI 代码中可用任何一种名称。
int count = 10;
double value = 2.5;
与下面的代码是等价的
System::Int32 count = 10;
System::Double value = 2.5;
上面 2 种代码是完全合法的,但应尽量使用基本类型名称,如 int 和 double,而不是 Syst
em::Int32 和 System::Double。这是因为上面描述的这种映射关系仅适用于 Visual C++ 2005
及以上版本的编译器,其他版本编译器未必实现这种映射关系。
将基本类型转换为值类类型是 C++/CLI 的一个重要特征。在 ISO/ANSI C++中基本类型
与类类型完全不同,而在 C++/CLI 中,所有数据都以类类型的形式存储,包括值类型(存储在
堆栈上)和引用类型(存储在堆上)2 种。
例子:Fruit CLR 控制台项目
在 Visual Studio 2005 中创建 CLR Console Application 项目,输入名称 Ex2_12,将生
成如下文件
// Ex2_12.cpp : main project file.
#include "stdafx.h"
using namespace System;
展开阅读全文