《C++ primer plus》读书笔记(一)(2)
21、原始(raw)字符串——原始字符串中,\n不表示换行符,如: 默认定界符 ( 和 ) cout << R"(don't use "\n" ,OK?)" << '\n'; 输出:don't use "\n" ,OK?
自定义定界符 +*( 和 )+* cout << R"+*("(don't use "\n" ,OK?)")+*" << '\n'; 输出:"(don't use "\n" ,OK)"
22、结构——
(1)、定义: struct man { char name[20]; double weight; int age; };
(2)、声明,允许省略关键字struct,如: man mike;
(3)、初始化: man mike {"mike", 56.2, 22};
(4)、使用成员运算符(.)来访问各个成员。
(5)、同时定义结构和创建变量: struct man { char name[20]; double weight; int age; } mike = {"mike", 56.2, 22}, jim ;
(6)、还可以声明匿名结构: struct { int x, int y } point ;
23、结构中的位字段——指定占用特定位数的结构成员,如: struct my_bit { unsigned int x : 4; bool y : 1; };
24、外部声明——函数外部的声明。C++不提倡使用外部变量,提倡使用外部声明。
25、共用体——
一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种类型,常用于节省内存。如: union id { long long_id ; char char_id; };
(1)、由于共用体每次只能存储一个值,其长度为最大成员的长度。
(2)、匿名共用体没有名称,其成员将成为位于相同地址处的变量,每次只有一个成员是当前成员。
26、枚举——
另一种创建符号常量的方式,可以代替const。如: enum spectrum { a , b , c , d , f };
(1)、默认情况下,a、b、c、d 、f 作为符号常量,对应0到4。
(2)、对于枚举,只定义了赋值运算符,并没有定义算术运算。
(3)、只能将定义枚举时使用的枚举量赋给枚举变量。
(4)、可以使用赋值运算符显式设置枚举量的值。如: enum bits { first , zero = 0 , two = 200 ,three , four }; //这里three的值为201, first 的值为0
(5)、枚举的取值范围。bits的最大值是202,大于它的最小的2的幂为256,所以bits的取值范围为0—255
(6)、通过强制类型转换,增加了可赋值给枚举变量的合法值,只要在取值范围内。如: bits b = bits(240);
27、指针——
指针是一个变量,存储的是值的地址,而不是值本身。
(1)、地址运算符(&)可以获得变量的位置(存储地址)。
(2)、指针,将地址看作指定的量,将值看作派生量。指针名表示地址。
(3)、*运算符被称为间接值(解除引用)运算符。用于指针可以得到指针地址存储的值。
(4)、声明: int * a; // *运算符两边的空格是可选的 int * b , c; // 创建指针b和int变量c,每一个指针都需要一个*
(5)、初始化: int * a = &b; // 将指针a的值设为&b
(6)、一定要在对指针使用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。
(7)、将数字赋值给地址: int * pt = (int * ) 0x8000000;
(8)、分配内存: int *pn = new int; //从堆(heap)或只有存储区(free store)的内存区域分配内存。
28、数组——
(1)、编译时给数组分配内存被称为静态联编,程序运行时选择数组长度被称为动态联编。
(2)、创建动态数组: int * p = new int [10]; // p为该元素第一个元素的地址
(3)、释放数组: delete [] p; // 只能释放new分配的内存; 不能delete两次; 对空指针delete安全; 数组用delete [] 释放。
(4)、不能使用sizeof运算符来确定动态分配的数组包含的字节数。
(5)、使用数组: p[0]为第一个元素,p[1]是第二个。 // C++内部使用指针来处理数组,p[1]被看作 *(p+1)
(6)、p = p + 1; // 指针变量加1后,增加的量为它指向的类型的字节数。
(7)、多数情况下C++将数组名解释为数组第一个元素的地址。