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