编程语言
首页 > 编程语言> > c++primer day2

c++primer day2

作者:互联网

 

 

 

 

 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<bits/stdc++.h>
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<<typeid(a).name()<<"\n\n";//A3_i 
61     cout<<typeid(b).name()<<"\n\n";//Pi
62     cout<<typeid(c).name()<<"\n\n";//A3_i
63     cout<<typeid(d).name()<<"\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<type>(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  

 

标签:10,初始值,int,元素,day2,c++,数组,primer,指针
来源: https://www.cnblogs.com/matt-su/p/16213983.html