1 数组和vector类似,数组的大小确定不变,不能随意向数组中增加元素。
2 数组维度必须是一个常量表达式
3 不允许用auto关键字由初始值列表推断类型,另外和vector一样,数组的元素应该为对象,因此不存在引用的数组
4 字符串字面值结尾处还有一个空字符
5 不能用一个数组初始化另一个数组
6 某些编译器支持数组的赋值,这就是编译器扩展,但是最好不要使用非标准特性,防止在其他编译器上无法工作
7 int *ptrs[10] ptrs 是含有10个整形指针的数组
int(*Parray)[10] =&arr ; parray 指向一个含有10个整数的数组
int (&arrRef) [10]=arr; arrRef引用一个含有10个整数的数组
由内向外读
8 数组下表通常被定义为size_t类型(机器相关的无符号类型),在cstddef头文件中定义了size_t类型
9 定义在函数内部的整型数组不会初始化
10 string *p2 =nums; 等价于 p2 =&nums[0];
11 auto ia2(ia) //ia2 表示一个整形指针,指向ia的第一个元素 p105
12 int ia[] ={0,1,2,3,4,5,6,7,8,9};
decltype(ia)返回的类型是由10个整数构成的数组
decltype(ia) ia3={1,2,3,4,5,6,7,8,9,10};
13 标准库函数begin 和 end 不是类函数,所以使用begin(数组名)表示指向首元素的指针
end(数组名)表示指向尾元素下一个位置的指针
14 尾后指针不能解引用以及递增操作
15 两个指针相减的类型是ptrdiff_t的标准库文件,和size_t类似,ptrdiff_t也是定义在cstddef头文件中机器相关的类型,带符号
16 int p =&ia[2]; p108
指针加下表
p[-2]=(p-2)
int k =p[-2] p[-2] 表示ia[0]
17 内置下标运算符所用的索引值不是无符号类型,这一点和vector string 不同
18
随机数生成
生成随机数种子
添加ctime,cstdlib头文件
srand((unsigned)time (NULL));
a[i]=rand()%10;//每次循环生成10以内的随机数并添加到a中
19 c风格字符串函数p109
头文件 cstring
strlen§ 返回字符串长度,空字符不算在内,遇到空字符停下来,p内必须要有空字符
strcmp(p1,p2) 比较两个字符串大小
strcat(p1,p2) 将p2附加到p1之后,返回p1
strcpy(p1,p2) 将p2拷贝给p1,返回p1
20 以列表初始化方式赋值的c风格字符串和以字符串字面值赋值的有所区别,后者会在字符串最后额外增加一个空字符表示字符串的结束,前者不会这么做
21 指针加法没有意义,减法如果指向同一个数组,那么表示所指元素在数组中的距离
22 string 下c风格的成员函数 c_str
const char *str=s.c_str();
c_str()返回的是一个c风格的字符串,函数返回的结果是一个指针,该指针指向一个以空字符结束的字符数组,而这个数组所存的数据恰好和string对象一样 p111
23 使用数组初始化vector对象
只用将数组的头,尾后指针传给容器的对象即可
24多使用string而避免使用c风格的基于数组的字符串
25
26 数组大小从1 开始,索引从0开始
27 如果表达式含有的下表运算符数量比数组的维度小,则表达式的结果将是给定索引处的一个内层数组
int (&row) [4] =ia [1]; 把row绑定到ia第二个4元素数组上
28 引用类型做循环变量。还有一个原因是防止数组自动转成指针
所以要使用for语句处理多维数组,除了最内层的循环外,其他所有循环控制变量都应该是引用类型
29 通过decltype或者auto可以避免在数组前面加上一个指针类型 p115
30 用begin end处理多维数组的遍历
31
理解这个方式
32
33 一元运算符和二元运算符,三元运算符的区别
34 当运算符作用于类运算对象时,用户可以自行定义它的含义,因为这种自定义的过程事实上是为已存在的运算符赋予了另外一层含义,所以称它为重载运算符
35 左值 右值区别p121
当一个对象用作右值时,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份
36 取地址符是一个作用于一个左值运算对象,返回一个指向该运算对象的指针,这个指针是一个右值;
内置解引用
下标运算符
迭代器解引用运算符
string&vector的下表运算符
内置类型和迭代器的递增递减运算符
的求值结果都是左值
37 因为解引用运算符生成左值,假设p的类型是int * 那么 decltype(*p)的结果是int &
因为取地址运算符生成右值 所以decltype(&p) 指向整型指针的指针 (对指针求地址)
38 求值顺序上,&& 运算符先算左侧运算对象的值,只有为真才会继续求右侧的
39 在表达式求值前,小整数类型的运算对象会被提升成大整数类型,所有运算对象最终会转换成同一个类型
40 短路求值 p126
41 进行比较时除非比较的对象时布尔类型,否则不要使用布尔字面值true 和false作为运算对象
42 赋值运算符的优先级低于关系运算符的优先级
43 前置和后置递增递减的区别 p131
44 建议养成使用前置的习惯
45 cout<<*iter++<<endl; 输出未+1的值,指针指向下一位
46 嵌套条件运算符 p134
47 小于运算符的优先级低于移位运算符
48 右结合律,左结合律
49 位运算符表 p136
位求反
位求异或
50 bitset标准库可以表示任意大小的二进制位集合
51 sizeof 运算符 p139
返回一个表达式或者一个类型名字所占的字节数
sizeof (type)
或者 sizeof expr
sizeof不会实际求运算的对象的值,并且不用解引用指针也能知道运算对象的类型
52 对数组执行sizeof运算得到整个数组所占的空间大小,等价于对所有元素执行一次sizeof并把所得结果求和
53 sizeof(ia)/sizeof(*ia)返回ia的元素数量
54
55 运算符的运算对象将转换成最宽的类型,当表达式既有整数类型也有浮点类型时,整数值将转换成相应的浮点类型 p143
不一样比int小提升成int
(同一类型)带符号数转换成不带符号数
(不同类型)带符号数和不带符号数需要根据所占空间大小进行转换
56 隐式类型转换,指向任意非常量的指针转换成void *,指向任意对象的指针转换成const void *
57 允许将非常量转换为const 的引用,以及非常量的地址转换为常量的地址,单不允许将const转换为非常量,因为这样会删除底层const
58 旧式地强制类型转换,与新式的强制类型换不同 p145
cast-name(expression)
static_cast const_cast(只改变常量属性,有重载函数的时候可以使用)
dynamic_cast 支持运行时的类型识别
59 使用 reinterpret_cast比较危险 p146
60 避免使用强制类型转换!
61 运算符优先级表
p147
62
63 关于逗号运算符 p150