一、类型别名
- 类型别名:是一个名字,它是同种类型的同义词
-
两种方法可用于定义类型别名:
- 关键字:typedef
- C++11新标准中的:using
- 用法如下:
typedef double wages; //wages是double的同义词 typedef wages base,*p; //base是double的同义词,p是double*的同义词 wages number=3.14; //double number=3.14; p=&number; //double* p=&number;using
- 新标准中规定了一种新的方法,使用别名声明来定义类型的别名
- 用法如下:
using SI=double; //SI等价于double using p_SI=double*; //p_SI等价于double* SI number=3.14; //double number=3.14; p_SI p=&number; //double* p=&number;指针、常量和类型别名关系
- 如果某个类型别名指代的是复合类型或常量,那么要注意以下的特殊情况
typedef char* pstring; char s = 'A'; const pstring cstr = &s; const pstring *ps=&cstr; printf("%c", **ps);//打印A
- 在上面的代码中,cstr是指向char的常量指针。而ps是一个二级指针,它的对象是指向char*指针的常量指针
- 概念:编程时常常需要把表达式的值赋值给变量,这时候就要清楚表达式的值,但是如果不知道表达式的类型就很麻烦。因此C++11引进了auto类型说明符,就能让编译器替我们去识别表达式的类型
-
auto的用法与注意事项
- auto定义的变量必须有初始化值:因为编译器是通过初始化的值来判断变量的类型的
- 声明多条语句时,变量的类型要一致
- 基本用法
auto a=10; //auto是int auto b='A'; //auto是char
auto i=0,*p=&i; //正确,i是整型,p是整型指针 auto s2=0,pi=3.14; //错误,s2与pi的数据类型不一致复合类型、常量与auto的使用
- 编译器推断出的auto类型有时候和初始值的类型并不完全一样,编译器会改变结果类型使其更符合初始化规则
- ①引用
int i=0,&r=i; //i是一个整型,r是一个引用 auto a=r; //a是一个整型
- ②auto一般会忽略顶层const,保留底层const
const int ci=0,&cr=ci; auto b=ci; //b是一个整型(ci的顶层const特性会被忽略) auto c=cr; //c是一个整型(cr是ci的别名,ci本身是一个顶层const) auto d=&i; //d是一个整型指针 auto e=&ci;//e是一个指向整数常量的指针(对常量对象取地址是一种底层const)
- ③&与*只是声明符,而非基本数据类型的一部分
int i=0; const int ci=1; auto k=ci,&l=i; //k是整数,l是整数引用 auto &m=ci,*p=&ci; //m是整型常量的引用,p是指向整型常量的指针 auto &n=i,*p2=&ci; //错误:i的类型是int,而&ci的类型是const int
- 5.其他
int arr[]={1,2,3}; auto arr2(arr); //arr2是int*类型 auto arr3(&arr[0]);//arr3也是int*类型三、decltype类型指示符
- 概念:decltype选择并返回操作数的数据类型,可以不初始化值
-
注意
- decltype返回的类型与括号内的结果有关,而与括号内的数据类型无关
- 并且decltype有很多方面需要注意,下面会详细介绍
- 基本用法
decltype(f()) sum=x; //如果f()是一个函数,则sum的类型就是f函数返回值的类型 //注:编译器并不实际调用函数f,而是直接获取其返回值类型decltype处理顶层const与引用
- ①.处理const int类型
const int ci=0,&cj=ci; decltype(ci) x=0; //x的类型是const int decltype(cj) y=x; //y的类型是const int& decltype(cj) z;//错误:z是一个引用,必须初始化值
- ②.处理引用:如果decltype处理的是一个表达式,则decltype返回表达式结果对应的类型
int i=42,&r=i; decltype(r) x=i;//x的类型是int & decltype(r+0) y=i;//y的类型是int,因为r+0返回的是一个整型
- 如果decltype处理的类型加上多层括号,则返回的是引用
int i=10; decltype(i) x=i;//x为int类型 decltype((i)) y=i;//y为int&类型
- 如果decltype处理的是解引用操作,则decltype将得到引用类型
int i=42,*p=&i; decltype(*p) x=i;//x类型为int&