面向对象编程的本质是设计并扩展自己的数据类型,设计自己的数据类型就是让类型与数据匹配。在C++编写语言中,其数据类型大致包含了两种类型,其详细情况见下图:
本博客主要对C++的基本数据类型进行相应的说明。
1 整型
整型是没有小数部分的数字,比如3, 20,-45等。在C++中整型大致包含了short int、int、long int等,不同的整型使用的内存量不同,内存量越大,可以表示整数值的范围越大。另外,有的类型可表示正值和负值,被称为有符号类型,还有一种只能表示正值和0,并不能表示负值,该类型为无符号类型。
求取不同的数据类型的长度,可以借助于运算符sizeof。对类型名使用sizeof运算符时,应将类型名放在括号中;对变量名使用sizeof运算符时,括号是可选的,例如:
sizeof(int) // int 为整数类型的名称
sizeof(number) // number为一个变量名
2 char类型
char类型是专为存储字符而设计的。char类型也可以看做是另外一种整型,它能够表示目标计算机系统中所有基本符号,即全部的字母、数字、标点符号等。实际上,很多系统支持的字母都不超过128个,因此用一个字节就可以表示所有的符号。
当程序需要处理的字符集可能无法用一个8位的字节表示,比如日文汉字系统。此时,C++引入一个能够存储更多字节的字符类型,即wchar_t。一般情况下,8位char可以表示基本字符集,wchar_t表示扩展字符集。
但对于输入输出流cin和cout来说,其被看做是char流,不能用来处理wchar_t类型。因此,在iostream头文件中引入了一种新的输入输出流,即wcin和wcout,专门用于处理wchar_t流。通常可以通过加上前缀L来指示宽字符常量和宽字符串。
3 浮点数
浮点数表示带小数部分的数字,如10.56,3.14159等。计算机将小数分成两部分来进行存储,一部分为表示值,另一部分用于对值进行放大或缩小。浮点数一般通过标准小数点表示法和科学计数法(E表示法)两种方式进行书写,E表示法最适合于非常大和非常小的数据。值得注意的是:使用E表示法时,数字中不能有空格。比如:
12.34 // 标准小数点表示
0.00023
2.52e+8 // 科学计数法
9.11E-30 // 科学计数法
8.6 E6 // 该表示是非法的,因为数字中存在空```
在C++中主要有三种数据类型来表示浮点数(float、double、long double)。float数据类型被称为单精度浮点数,double类型为双精度,一般情况下double类型是float类型的两倍大小。这些数据类型主要取决于当前使用计算机内存的大小。但可以肯定的是:
- double至少与float一样大;
- long double至少与double一样大。
下表为三种浮点数类型的大小与取值范围:
下述通过程序来进一步说明浮点数类型
// This program uses two floating-point data types, float and double.
#include <iostream>
using namespace std;
int main()
{
float distance = 1. 496E8; //in kilometers
double mass = 1.989E30; //in kilograms
cout << "The Sun is " << distance << " kilometers away.\n";
cout << "The Sun\'s mass is " << mass << "kilogrames.\n";
return 0;
}
程序输出结果:
The Sun is 1.496e+008 kilometers away.
The Sun's mass is 1.989e+030 kilograms.
这三种浮点数数据类型的差异在于有效位数的不同。有效位是指数字中有意义的位,有效位不依赖于小数点的位置。float、double和long double三种类型的有效位数要求是:float至少32位,double至少48位,且不少于float,long double至少和double一样多。
相比于整型,浮点数数据类型存在两个优点:
- -可以表示整数之间的值;
- 由于缩放因子,它可以表示的范围更大。
但是也存在一个缺点,即浮点运算的速度通常比整数运算慢,且精度降低。
4 const常量
const为constant的缩写,意思是不变的。在C++中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。const是C++中常用的类型修饰符,使修饰的变量或对象是不能被更新的。常量被初始化后,其值就被固定了,编译器将不允许再修改该常量值。关键字const也叫做限定符,限定了声明的含义。const常量创建的通过格式为:
const 数据类型 变量名 = 数值;
注意,应在声明中对const进行初始化。
在C语言中,#define语句也与const相同的作用。但是与define相比,const主要有三个优点:
- 它能够明确指定类型;
- 可以使用C++的作用域规则将定义限制在特定函数或文件中;
- const可应用于更复杂的数据类型,比如数组和结构体。
5 C++算术运算符
C++的算术运算符较多,这里主要对下列基本的算术运算符进行说明:
- +运算符对操作数执行加法运算;
- -运算符对操作数执行减法运算;
- *运算符将操作数相乘;
- /运算符为第一个操作数除以第二个操作数;
- %运算符表示求模,即求余数。
对于除数运算符(/)来说,其行为取决于操作数的类型。若两个操作数都是整数,则执行的是整数除法,即小数部分被截断,得到一个整数结果。若两个操作数有一个为浮点数,则小数部分保留,得到一个浮点数。例如:
10/4 // 执行结果为2
10.0/4 // 执行结果为2.5
对于求模运算符(%),需要注意的是两个操作数必须为整数,如果其中一个是负数,则结果的符号满足规则:(a/b)*b+a%b = a.
6 类型转换
6.1 初始化和赋值进行类型转换
C++允许将一种类型的值赋值给另一种类型的变量,此时值将被转换为接收变量的类型。赋值过程中,有时候会遇见两种情况,一种是将一个值赋给值取值范围更大的类型,这种情况不会出现什么问题;另外一种情况是将值赋给值取值范围较少的类型,这种情况会出现潜在为转换问题,其详情如下:
- 大的浮点类型转换为较小浮点类型会导致精度降低,值可能超出目标类型的取值范围;
- 浮点数转换为整型会使得小数部分丢失,原来的值可能超出目标类型的取值范围;
- 较大的整型转换为较小的整型也会使得原来的值超出目标类型的取值范围。
6.2 表达式中的转换
当同一表达式中包含两种不同的算术类型时,C++将执行类型自动转换。通常有下列转换要求:
- 如果有一个操作数的类型是long double,则将其它操作数转换为long double;
- 否则,如果有一个操作数的类型是double,则将其它转换为double;
- 否则,如果有一个操作数的类型是float,则将其它转换为float;
- 否则,操作数都是整型,则需执行整型提升,即转换为int。
- 如果两个操作数都是有符号或无符号,且其中一个操作数的级别较高,则转换为级别较高的类型;
- 如果一个为有符号类型,另一个为无符号类型,且无符号类型级别较高,则将有符号类型转换为无符号类型。
6.3 强制类型转换
C++可以通过强制类型转换机制显示地进行类型转换。其通过格式为
(typeName) value // 来自于C语言格式
typeName (value)