处理类型
1.类型别名
类型别名是某种类型的同义词。 使用类型别名可以让复杂的类型名字变得简单明了、易于理解和使用。
使用类型别名的两种方法:
- 使用typedef:
typedef double wages; //wages是double的同义词
typedef int *p; //p是int*的同义词
- 使用别名声明using:
using SI=Sales_item; //SI是Sales_item的同义词
2.auto类型说明符
将表达式的值赋值给变量,这就要求在声明变量的时候需要推断出表达式的类型,但有时做不到这一点。
用auto类型就可以自动推断表达式的类型来推算变量的类型,auto定义的变量必须有初始值。
//根据v1和v2相加结果来推断item的类型,v1、v2int型则item为int型;若v1 int 型,v2 double型则item为double型
auto item=v1+v2;
因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据都必须一样:
auto i=0,*p=&i; //正确:i整型,p整型指针
auto sz=0,pi=3.14; //错误:sz整型,pi浮点型数据类型不一致
const int ci=10;
auto &n=i,*p=&ci; //错误:i的类型是int,&ci的类型是const int,类型不一致
auto忽略掉顶层const,而保留底层const,如果希望推断出auto的类型是一个顶层const需要指出:
const int ci=10;
auto b=ci; //b是有一个整数,ci的顶层属性被忽略
auto e=&ci; //e是一个指向整型常量的指针,(对常变量对象取地址是一种底层const)
const auto f=42; //f是const int型
3.decltype
如果希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量。
decltype类型说明符的作用是选择并返回操作数的数据类型。 在此过程中,编译器分析表达式并得到它的类型,缺不计算表达式的值。
decltype(f()) sum=x; //sum的类型即f的返回类型
decltype和引用
如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。例如赋值表达式返回的类型就是这个类型的引用,如:a=10;返回的类型是int &型。
- 如果表达式的内容是解引用,则解引用指针返回的类型是指针:
int i=42,*p=&42;
decltype(*p) b; //错误:b的类型是int的引用,必须初始化
- 算数表达式返回的结果是值的类型;赋值表达式返回的类型,是返回值类型的引用
int a=10,b=20;
decltype(a+b) c; //正确:c的类型是int型
decltype(a=30) d; //错误:d的类型是int&型
- 如果给变量加了一个括号,编译器会把它当成一个表达式,变量作为表达式可以作为赋值语句的左值,所以对这样的decltype就会得到引用类型。
int i=1;
decltype(i) v; //v的类型是int型
decltype((i)) v2; //错误:v2的类型是int&型,必须初始化。