C++学习笔记之三 数据处理(基本数据类型)

面向对象编程(OPP)的本质是设计并扩展自己的数据类型。面向对象的编程的基本做法就是针对一个对象创建或找到一个类,这个类正好能够描述或表达对象的特征或动作。所谓的类其实就是自己设计的一种数据类型,这种类型根据对象的特征或者设计者需要设计。整个面向对象的编程就是由这样的许多类组合而成,所以说面向对象的编程本质其实就是设计这样的叫做类的数据结构。

设计自己的数据类型就是让类型与数据匹配,如果能够做到这一点以后使用数据就会容易得多了。然而,这些复杂类的的创建都是在C++内置的类型的基础上编写的,所以在创建对象类之前,我们必须对C++的基本类型有熟练的应用和了解。

内置的C++类型分为两组:基本类型和复合类型。我们本节中先介绍一下基本类型,即整数和浮点数。当然,看似只有两种类型,其实为了满足所有的编程需求,C++还提供了许多种变体。

1、简单变量的存储原理

比如 int braincount;

braincount = 5;

这两条语句告诉程序,它正在存储整数,并且使用名称braincount来表示该整数的值(这里是5)。实际上程序将找到一块能够存储整数的内存,将该内存单元标记为braincount,并将5复制到该内存单元中。然后,你就可以使用braincount来访问该内存单元。

2、关于变量命名

命名的规则大家可能都非常熟悉了,但有一点容易忽视的我还是要强调一下:以两个下划线或下划线和大写字母比如_time_stop或_Donut打头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符。

这里要特别注意,像这样的名称不会导致编译器错误,而会导致行为的不确定性。换句话说,不知道结果将是什么。不出现编译器错误的原因是这样的命名不是非法的,而是留给实现使用。

如果想用两个或更多的单词组成一个名称,通常的做法是使用下划线字符将单词隔开,如my_onions;或者从第二个单词开始将每个单词的第一个字母大写,如myEyeTooth。C程序员倾向于第一种下划线方式,而Pascal程序员喜欢大写方式。这都是可以的。

3、关于整型

在不同的操作系统中对于整型的最小长度定义是不一样的。比如在IBM PC的实现中,int的宽度为16位(与short相同),而在WindowsXP、Vista、Windows7、OS X、VAX和很多其他微型计算机的实现中,为32位(与long相同)。由于不同的系统中对最小的整型长度定义可能不同,所以在将C++程序从一种环境移到另一种环境(包括在同一个系统中使用不同编译器)时会引发问题。

那么在对C++程序进行移植时,如果遇到问题,开发者想要找到当前系统下对整型长度的定义呢?可以在程序中使用C++工具来检查类型的长度。在头文件climits中包含了关于整形限制的信息。具体地说,它定义了表示各种限制的符号名称。



通过sizeof运算符就可以看到当前系统中对整型变量的长度的定义了。

4、关于溢出

整型变量的行为就像里程碑,如果超越了限制,其值将为范围另一端的取值。C++并不保证符号整型超越限制(上溢和下溢)时不出错,而这正是当前实现中最为常见的行为。越过临界点,就会进入反方向的最值,比如有符号数大于32767下一个数就是-32768,小于1就是0再然后是-1。无符号数大于65535就是0。


5、整型类型的选择

int类型是计算机处理起来效率最高的长度。如果没有非常有说服力的理由选择其他类型,则应该使用int。

如果变量表示的值不可能为负,如文档中的字数,则可以使用无符号的类型,这样变量可以表达更大的值。

如果变量可能表示的整数值大于16位整数的最大可能值,则使用long。即使系统上int为32位,也应该这么做。这样将系统移植到16位系统时,就不会突然无法工作了。

如果要存储的值超过20亿,可使用long long。

如果short比int小,则使用short可以节省内存。通常,仅当有大型整型数组时,才有必要使用short。如果节省内存很重要,则应该使用short而不是int,即使他们的长度一样,例如从int为16位的系统移到Int为32位的系统,则用于存储int数组的内存量将加倍,但short不受影响。

如果只需要一个字节,可使用char。

6、char类型:字符和小整数

  char类型是一种整型,是专为存储字符(如字母和数字)而设计的。对于字母的存储,编程语言通过使用字母的数值编码解决了这个问题。所以,char类型是一种整型。因为很多系统支持的字符都不超过128个,所以用一个字节就可以表示所有的字母、数字、标点符号等。char类型是占一个字节的整型,所以可以将它用作比short更小的整型。

char类型的存储形式,例如字符A的编码是65,那么在内存中存储的就是整型65,但是以cout或cin输入输出时cin或cout就能智能的将char类型的输出打印为A。

在美国,最常用的字符集是ASCII字符集,字符集中的字符用数值编码(ASCII码)表示。然而,C++实际使用的是其主机系统地编码-----例如,IBM大型机使用的是EBCDIC编码。然而,ASCII和EBCDIC码因为字符数较少,表示字母、数字和标点够用,但是要想表示世界上的其他语言比如中文,就远远不够了。所以为了满足国际需求,C++支持的宽字符类型可以存储更多的值,如国际Unicode字符集使用的值。

(1)通用字符名

C++实际支持一个基本的源字符集,即可用来编写源代码的字符集,它由标准美国键盘上的字符(大写和小写)和数字、C语言中使用的符号(如=)以及其他一些字符(如换行符和空格)组成。还有一个基本的执行字符集,它包括在程序执行期间可处理的字符(如可从文件读取或显示在屏幕上的字符),它增加了一些字符,如退格和振铃。

除了这些基本的字符集之外,C++标准还允许实现提供扩展源字符集和扩展执行字符集。也就是说,德国实现可能允许使用日耳曼语的元音变音,而法国实现则允许使用重元音。C++有一种表示这种特殊字符的机制,它独立于任何特定的键盘,使用的是通用字符名(universal character name)。

通用字符名的用法类似于转义序列。通用字符名可以以\u或\U打头。\u后面是8个十六进制位,\U后面则是16个十六进制位。这些位表示的是字符的ISO 10646码点,这种码点为大量的字符提供了数值编码。通俗地讲,其实就是提供了更多位的编码序列,比如可以用00F6表示汉字“语”,那么在支持扩展字符的编程中我们就可以使用/u00F6表示汉字了。通过这种方法,使得我们的程序中不再只能使用字母数字等,还可以使用各种其他语言比如汉语、日语等等。

当然,这种编码方式只有在支持ISO10646的系统中才能使用和被识别,否则系统无法将这种代码识别为某种特殊字符。

请注意,C++使用术语“通用编码名”,而不是“通用编码”,这是因为应该将\u00F6解释为“Unicode码点为U-00F6的字符”。支持Unicode的编码器知道这表示哪一个字符,而无需使用内部编码00F6.

(2)Unicode和ISO10646 

Unicode提供了一种表示各种字符集的解决方案-----为大量字符和符号提供标准数值编码,并根据类型将它们分组。例如,ASCII码为Unicode的子集,因此在这两种系统中,美国的拉丁字符(如A和Z)的表示相同。然而,UNicode还包含其他拉丁字符,如欧洲语言使用的拉丁字符、来自其他语言(如希腊语、西里尔语、希伯来语、阿拉伯语)中的字符以及象形文字(如中国和日本的文字)。到目前为止,Unicode可以表示109000多种符号和90多个手写字符,他还在不断发展中。

Unicode给每个字符指定一个编号----码点。Unicode码点通常类似于下面这样:U-222B。其中的U表示这是一个Unicode字符,而222B是该字符的十六进制编号。

国际标准化组织(ISO)建立了一个工作组,专门开发ISO10646-----这也是一个对多种语言文本进行编码的标准。ISO10646小组和Unicode小组从1991年开始合作,以确保标准同步。

(3)unsigned char和signed char

与int不同的是,char在默认的情况下既不是没有符号,也不是有符号的。是否有符号由C++决定,这样编码器开发人员可以最大限度的将这种类型与硬件属性匹配起来。如果char有某种特定的行为对您来说特别重要,则可以显式的将类型设置为signed char或unsigned char:

char fodo;     unsigned char bar;       signed char snark;

如果使用char变量来存储标准ASCII字符,则char有没有符号都没有关系,这时候可以使用char;但是如果将char当作数值类型,则unsigned char 和signed char之间的差异将非常重要。unsigned char类型表示范围通常是0~255,而signed char的表示范围为-128~127。这样在存储数据的时候就要特别注意标明有无符号了。

(4)wchar_t

当程序需要处理的字符集无法用一个8位的字节表示的时候,如日文、汉字系统,C++的处理方式有两种。首先,如果大型字符集是实现的基本字符集(也就是说需要经常使用大型字符),则编译器厂商可以将char定义为一个16位的字符或更长的字符。其次,一种实现可以同时支持一个小型的字符集和一个较大的扩展字符集。8位的char可以表示基本字符集,另一种类型wchar_t(宽字符类型)可以表示扩展字符集。wchar_t类型是一种整数类型,它有足够的空间,可以表示系统使用的最大扩展字符集。

cin和cout将输入和输出看作是char流,因此不适合用来处理wchar_t类型。iostream头文件最新版本提供了wcin和wcout,可用于处理wchar_t流。另外,可以通过加上前缀L来表示宽字符常量和宽字符串。例如:

wchar_t bob = L'P';

wcout<<L"tall"<<endl;

7、const限定符

const限定符的作用与在预处理中用#define语句类似,都是声明用一个字符表示一个常量,这个常量在程序中不可更改。这样声明可以使程序员对常量表示的意思一目了然而不必每次使用一个常量。例如,const int Months =12; 这样便可以在程序中使用Months了,而不是使用12(在程序中,12可能表示一英寸或一打面包圈,而名称Months指出了值12表示什么)。常量被初始化后,其值就被固定了,编译器不允许在修改该常量的值。

创建常量的通用格式 const type name = value; 注意,应该在声明中对const进行初始化,下面这种不正确: const int toes;  toes =10;如果在声明常量时没有提供值,则该常量的值将是不确定的,且无法修改。

与#define相比,const限定符的使用有哪些好处呢?首先,它能够明确指定类型。其次,可以使用作用域规则将定义限制在特定的函数或文件中(就是说#define只能放在文件最前面,而const跟普通变量定义一样可以放在需要的函数中或模块中,仅供某一部分模块使用)。第三,可以将const用于更复杂的类型,比如数组和结构。

所以以后尽量不要在使用#define了,使用const更加方便。

8、浮点数

C++有两种书写浮点数的方式,第一种是使用常用的标准小数点表示法;另一种表示浮点值的方法叫做E表示法。

(1)浮点常量(浮点常量在默认的情况下为double类型)

在默认的情况下,像8.24和2.4E8这样的浮点常量都属于double类型,如果希望常量为float类型,请使用f或F后缀;对于long double类型,可使用l或L后缀。示例如下:

1.234f (浮点型 )     2.45E20F(浮点型)        2.345324E28 ( double型)  2L (long double常量)

9、C++算数运算符

对于C++基本运算大家应该都比较熟悉了,从学会写代码开始大家可能就在使用各种运算,所以此处就不详细介绍了,只对个别需要注意的地方介绍一下。

强制类型转换

C++允许通过强制类型转换机制显式的进行类型转换。强制类型转换的格式有两种:(typeName)value;        typeName(value);  第一种格式来自C语言,第二种格式纯粹是C++。新格式的想法是想让强制类型转换像是函数的调用。

C++还引入了4个强制类型转换运算符,将在后面介绍。

10、C++11中的auto声明

C++新增了一个工具,让编译器能够根据初始值的类型推断变量的类型,所以重新定义了auto。如果使用auto而不指定变量的类型,编译器将把变量的类型设置成与初始值相同:

auto n=100;   //n是int型      auto x=1.5;  //x是double型       auto y=1.3e12L   //y是long double型






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值