三、C++数据类型
7、布尔类型
bool类型的值可以赋予文字true和false。
bool类型虽然能够隐式转换为1和0用来表示true和false,但是不能够显式声明:
short bool found = false; //错误
当然,算术值和指针也能够隐式转换成bool类型【0和空指针是false,其他值是true】。
8、枚举类型
枚举类型存在的意义:限定函数传递参数的值就在枚举类型的范围里面。
枚举类型的定义【它定义了整型常量并把它们组成了一个集合】:
enum open_modes{ input = 1, output, append };
枚举类型的定义可以和类的定义有点相似,可以看成是类但是没有方法,只有成员,而且成员是整型常量。【个人理解】在缺省状态下,枚举对象中第一个成员被赋值为0,后面的成员依次加一,
枚举类型使用方法:
void open_file( string file_name, open_modes om );
open_file( "Phoenix and the Crane", append );//我们只能传递枚举的名字,但是不能传递代表它的整数值
枚举对象可以和类一样被声明,在初始化时,只能够赋予其中一种状态,不能够给多种状态,也一定是在枚举类型的范围里面的值,要用名字初始化:
open_modes om = input;
// ...
om = append;//om不能被打印出它代表的类型的名字
C++也不支持使用枚举成员进行迭代遍历,因为它不支持在枚举成员之间的前后移动:
// 不支持
for ( open_modes iter = input; iter != append; ++iter )
// ...
枚举类型在使用时,可以被自动提升为算术值:
const int array_size = 1024;
// ok: pt2w 被提升成 int 类型
int chunk_size = array_size * pt2w;
9、数组类型
数组是单一数据类型对象的集合体,可以通过下标访问。
数组的定义由类型名、标识符和维数组成。
int ia[10];
数组的维数必须是常量,变量不能够用来指定数组的大小。【必须是const变量才行,如果使用函数返回的值也一定要用const】
数组访问的索引从0开始。
数组的显式初始化:
const int array_size = 5;
int ia[ array_size ] = { 0, 1, 2 };//系统分配5给数组,没有被显式初始化的值是0
int ia[] = { 0, 1, 2 };// 系统自动分配空间,最大是3
字符数组的初始化【两种方式】:
const char ca1[] = { 'C', '+', '+' };
const char ca2[] = "C++";
第一种方式和第二种方式虽然都定义了C++这三个字符,但是第二个数组的长度比第一个数组长一,因为第二种方式定义时蕴含了一个隐藏的终止符。
数组之间不能互相初始化和赋值,也不能引用一个数组。【数组不能成块操作】
二维数组的初始化,使用逗号和大括号:
int ia[ 4 ][ 3 ] = {
{ 0, 1, 2 },
{ 3, 4, 5 },
{ 6, 7, 8 },
{ 9, 10, 11 }
}
int ia[4][3] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
int ia[ 4 ][ 3 ] = { {0}, {3}, {6}, {9} };// 这种方式定义了每一行第一个元素,以逗号分割
int ia[ 4 ][ 3 ] = { 0, 3, 6, 9 };// 这种方式定义了第一行和第二行第一列的元素
ia[ 1, 2 ] 这个表达式虽然是正确的,但是并没有创建一个二维的数组。
数组的名字代表了这个数组的首地址,相当于指针类型,可以用下标操作符取址访问数组的第n个元素的地址。&a[n]
因为数组的名字相当于数组的首地址的指针,所以对于指针的运算也可以用在数组的名字上:
ia+1;
*(ia+1);
ia[1];
上面第二个一定要先加括号,不然表达式的意思为第一个元素加一。