1 vector对象容纳的元素如果是内置类型,会进行默认初始化,某种类型则元素由类默认初始化;这是很显然的;
2 一般()默认构造对象,{}默认初始化;
3 如vector<int>v(10);//创建10个int元素,初始值默认为0;
4 vector<int>v{10};//v有一个元素,初始值为10;
5 vector<int>v(10,1);//创建10个元素,初始值为1;
6 vector<int>v{10,1};//创建两个元素初始值分别为10,1;
7 这里要说的是当{}里的值无法解释成元素初始值是,会解释称n个元素,默认初始值为val;
8 如下:
9 vector<string>v{10};//无法解释为创建一个元素初始值为int类型的10,所以被解释为创建10个string元素;
10 vector<string>v{10,"hi"};//显然10是int类型无法解释成string,所以编译器会优化成创建十个元素,初始值全为"hi ;
11
12 不要在用迭代器遍历容器时向容器添加元素;
13 这时候可能造成容器重新申请一片内存扩容,导致原来指针指向的地址无效;
14
15
16 与内置类型一样,如果函数内部定义了内置类型的数组,则里面的元素不会初始化,要全局变量才会默认初始化;
17
18 内置数组int a[10],b[]={1,2,3};
19 内置数组不能用数组初始化也不能用数组赋值
20 如int a[]=b;或者a=b;
21
22 int *p[10],与int (*p)[10],与int *p=&r的理解;
23 先找变量名,然后默认优先跟右边结合形成类型,若是右边没有则跟左边,最后剩下的都是指向的类型;
24 如int *p[10];//p先跟右边括号结合表示这是一个数组类型,然后数组元素为int *;
25 int (*p)[10];//由于有括号p与*结合形成指针类型,剩下的是指向类型,也就是说指向的是int [10];
26 int *p=&r;//p右边没东西,跟左边结合形成*p指针类型,指向int型对象;
27 int **p;//同理p是指针指向int *即p是二级指针;
28 //int *不能理解成int*是一个新类型,如果这样理解那么int* a=&r,b;这条语句应该是定义两个指针的,但是后面是定义的是int类型,说不通;
29
30 取地址符可以作用于任何对象;对象是一个在内存中的变量
31
32 数组里的元素也是对象,所以可以这样操作;
33 string nums[]{"1","2","3"};
34 string *p=&nums[0];//1
35 数组名是一个指向nums[0]的指针;
36 也可以这样string *p=nums;//等价1式;
37
38 int a[10];
39 a[5]=*(a+5);//这是一个int数据类型
40
41 char a[]={'a','b'}//没有以空字符结尾,遍历时会停不下来,很危险
42 string a;默认有\0;const char * p="abc";也默认有\0 ;只有字符数组要自己添加\0,并要为其预留位置
43
44 int a[2][3];
45 auto 推理数组名时,如果遇到纯粹的数组名会被推理成指针,其他(如引用)会按照数组推理;
46 使用for(auto : row)循环数组时要用引用;
47 因为如果不用引用会被解释成指针;从而不能循环,而用引用会被解释成数组;
48 #include
49 using namespace std;
50
51
52 int main()
53 {
54
55 int a[]={1,2,3};
56 auto b=a;
57 auto &c=a;
58 int d=10;
59 int *p=&d;
60 cout<"\n\n";//A3_i
61 cout<"\n\n";//Pi
62 cout<"\n\n";//A3_i
63 cout<"\n\n";//i
64 return 0;
65 }
66
67 表达式求值过程中不同类型的对象如果可以转换会自动转换,转换规则是小的转成大的,int->long long->double;
68 int *p=&a;
69 *p解引用出来的一个int &类型,因为我们可以对*p=1;这样的操作
70 所以肯定是在操作它的引用,int &t=a,t=1 ;而不是int t=1,这样a是不可能变成1的;
71 /除法无论正负一律向0取整;就是去掉小数部分
72
73 初始化列表不会进行类型转换
74 如int k={1.9};//把浮点数赋给int是不行的;
75 int k = 1.9这样赋值等价于k=1;自动转换;
76
77 在大多数数组的表达式中,数组自动转换成指向数组元素首元素的指针
78
79 当数组被用作decltype关键字的参数或者&、sizeof及typeid时数组不会转换成指针
80 这也是之前为什么for(auto :&p:a)要用引用了
81
82 强制类型转换模板
83 cast-name(expression);
84
85 static_cast://类型转换
86 只要不包含底层const都能用这个,也就是指向值不能变的;
87 如 double tmp=static_cast<double>(j)/i;//把j转成double然后计算;
88
89 const_cast://只改变常量属性
90 const_cast只能改变对象的底层const;
91 如const char *p;
92 char *a=const_cast<char*>(p);
93
94 reinterpret_cast//这个我不懂别用
95 int *p;
96 char *pc =reinterpret_cast<char*>(p);
97 本来指针p+1是按照四字节偏移的,现在pc+1按照1字节偏移去解释原来int地址的东西
98
99