类型组合、auto
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 struct ant_years_end 5 { 6 int year; 7 }; 8 int main() 9 { 10 ant_years_end s01, s02, s03;// 结构变量 11 s01.year = 1998; 12 ant_years_end* pa = &s02;//结构指针 13 pa->year = 1999; 14 ant_years_end trio[3];//结构数组 15 trio[0].year = 2003;//直接成员运算符访问元素的成员 16 //trio是一个数组,trio[0]是一个结构,trio[0].year是该结构的一个成员 17 cout << trio->year << endl;//数组名是一个指针,∴也可以使用间接成员运算符 18 const ant_years_end* arp[3] = { &s01,&s02,&s03 };//一个指针数组,指针数组其中的每一个元素对应一个结构变量的地址 19 cout << arp[1]->year << endl;//指针数组成员使用间接成员运算符 20 const ant_years_end** ppa = arp; 21 //arp是一个数组名,所以arp代表数组的地址,即数组第一个元素的地址,但arp是一个指针数组,∴arp[1]也是一个指针 22 // 左:一个指针 arp[1] 23 // 右:一个指针 地址不可更改的指针ppa的地址被当作对象存到新指针里 24 // 左=右 新指针地址等于arp[1]地址,arp[1]解除引用后得到指针ppa的地址(即指针数组第一个元素(那个指针)的地址) 25 //拆解:const ant_years_end* t = arp; 此句中蕴含一个指针常量,说明指针t是一个常量,地址为arp地址,该指针地址不可通过修改t来实现; 26 // t = *ppa; t是一个数组的首地址 27 // 所以整句的意思就是: t确定一个数组首地址,将这个首地址作为对象存储到新指针*t中,新指针不可更改地址; 28 auto ppb = arp; //auto关键字作用是在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型 29 cout << (*ppa)->year << endl;//注意一定要加括号,否则会结合错误 30 /* 31 使用ppa访问数据的方法: 32 ppa是一个指向结构指针的指针,*ppa是一个结构指针,可以使用间接运算符 33 ∴利用*ppa->year访问数据 34 */ 35 cout << (*(ppb + 1))->year << endl; 36 return 0; 37 }
auto的使用限制
2.1. auto 变量必须在定义时初始化,这类似于const关键字
auto a1 = 10; //正确
auto b1; b1 = 10;
//错误,编译器无法推导b1的类型
2.2. 定义在一个auto序列的变量必须始终推导成同一类型
auto a4 = 10, a5{20}; //正确
auto b4{10}, b5 = 20.0; //错误,没有推导为同一类型
2.3. 如果初始化表达式是引用或const,则去除引用或const语义。
int a{10}; int &b = a;
auto c = b; //c的类型为int而非int&(去除引用)
const int a1{10};
auto b1 = a1; //b1的类型为int而非const int(去除const)
2.4. 如果auto关键字带上&号,则不去除引用或const语意
int a = 10; int& b = a;
auto& d = b;//此时d的类型才为int&
const int a2 = 10;
auto& b2 = a2;//因为auto带上&,故不去除const,b2类型为const in
2.5. 初始化表达式为数组时,auto关键字推导类型为指针。
int a3[3] = { 1, 2, 3 };
auto b3 = a3;
cout << typeid(b3).name() << endl; //输出int * (输出与编译器有关)
2.6. 若表达式为数组且auto带上&,则推导类型为数组类型。
int a7[3] = { 1, 2, 3 };
auto& b7 = a7;
cout << typeid(b7).name() << endl; //输出int [3] (输出与编译器有关)
2.7. C++14中,auto可以作为函数的返回值类型和参数类型
#include <iostream>#include <cstring>using namespace std;struct ant_years_end{int year;};int main(){ant_years_end s01, s02, s03;// 结构变量s01.year = 1998;ant_years_end* pa = &s02;//结构指针pa->year = 1999;ant_years_end trio[3];//结构数组trio[0].year = 2003;//直接成员运算符访问元素的成员//trio是一个数组,trio[0]是一个结构,trio[0].year是该结构的一个成员cout << trio->year << endl;//数组名是一个指针,∴也可以使用间接成员运算符const ant_years_end* arp[3] = { &s01,&s02,&s03 };//一个指针数组,指针数组其中的每一个元素对应一个结构变量的地址cout << arp[1]->year << endl;//指针数组成员使用间接成员运算符const ant_years_end** ppa = arp;//arp是一个数组名,所以arp代表数组的地址,即数组第一个元素的地址,但arp是一个指针数组,∴arp[1]也是一个指针// 左:一个指针 arp[1]// 右:一个指针 地址不可更改的指针ppa的地址被当作对象存到新指针里// 左=右 新指针地址等于arp[1]地址,arp[1]解除引用后得到指针ppa的地址(即指针数组第一个元素(那个指针)的地址)//拆解:const ant_years_end* t = arp; 此句中蕴含一个指针常量,说明指针t是一个常量,地址为arp地址,该指针地址不可通过修改t来实现;// t = *ppa; t是一个数组的首地址// 所以整句的意思就是: t确定一个数组首地址,将这个首地址作为对象存储到新指针*t中,新指针不可更改地址;auto ppb = arp; //auto关键字作用是在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型cout << (*ppa)->year << endl;//注意一定要加括号,否则会结合错误/*使用ppa访问数据的方法:ppa是一个指向结构指针的指针,*ppa是一个结构指针,可以使用间接运算符∴利用*ppa->year访问数据*/cout << (*(ppb + 1))->year << endl;return 0;}

浙公网安备 33010602011771号