代替类型名:关键字typedef、auto、decltype的使用讲解

为了明确体现类型的真实目的和含义,以及便于记忆及防止出错,C++提供了多种类型名字的替代方法,下面逐一讲解一下:

1.类型别名

类型别名是一个名字,它是某种类型的同义词,使用它让复杂的类型名字变得简单明了,易于理解和使用,还有助于程序员清楚的知道使用该类型的真实目的。

定义类型别名有两种方法:

1:用关键字typedef定义,关键字typedef作为声明语句的基本数据类型的一部分出现,这里的声明符也可以包含类型修饰,从而也能由基本数据类型构造出符合类型来。

2:新标准使用了一种新的方法,使用关键字using作为别名声明的开始,气候紧跟别名和等号,作用是把等号左侧的名字规定成等号右侧类型的别名。

typedef double wages;               //wages是double的同义词
typedef wages base, *p             //base是double的同义词,p是double *的同义词</span>
注意,如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果。

typedef char  *pstring;     //pstring是char*的别名
const pstring cstr=0;        //pstring 实际上是指向char的指针,因此,const pstring就是指向char的常量指针,而非指向常                                               量字符的指针
const pstring *ps;            //ps是一个指针,他指向的对象是指向char的常量指针
const char *cstr=0;         //往往我们会倾向于把类型别名替换成它原来的样子,这样是错误的,这样改写的结果是,const char成了基本类型,它成了一个指向const char的指针,而愿意是指向char的常量指针,显然二者区别明显。

2.auto类型说明符

编程时常常需要把表达式的值赋给变量,这就需要在声明变量时知道表达式计算出的结果的类型,然而有时候知道这个类型却是很麻烦,为此C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型,显然一个前提是,auto定义的变量必须有初始值。

使用auto也能在一条语句中声明多个变量,因为一条声明语句只能有一个基本数据类型,所以该语句中多有的初始基本数据类型必须都一样:

auto item=val1+val2;      //有二者相加的结果推断出item的类型
auto i=0,*p=&i;              //正确:i是整数,P是整型指针
auto sz=0,pi=3.14;         //错误:sz和pi的类型不一致
由编译器推断出来的auto类型有时候和初始值的类型也不完全一样,编译器会作适当修改:

1.当使用引用作初始值类型时,此时auto的类型是引用对象的类型。

2.auto一般会忽略掉顶层const,同时底层const则会保留下来。

int i=0,&r=i;
auto a=r;                      //a是一个整型(初始值的引用类型被忽略)

const int ci=i,&cr=ci;
auto b=ci;                   //b是一个整型(顶层const特性被忽略)
auto c=cr;                   //c是一个整型(首先忽略掉引用类型,再忽略掉顶层const类型)
auto d=&i                   //d是一个整型指针(此时的d前的指针可加可不加)
auto e=&ci                 //e是一个指向整型常量的指针

const auto f=ci;         //f是一个整型常量,如果希望推断出的auto类型是个顶层const,需要明确声明

//可以将引用的类型设置为auto,原初始化规则任适用
auto &g=ci;              //g是一个整型常量引用
auto &h=42;             //错误:不能为非常量引用绑定字面值
const auto &j=42     //正确

//要在一条语句中定义多个变量,切记,符号&和*只从属于某个声明符,而非基本数据类型的一部分,因此初始值必须是同一类型
auto k=ci,&m=i;
auto &n=ci,*p=&ci;
auto &q=i,*s=&ci;    //错误:i的类型时int型而&ci的类型却是const int 型

3.decltype类型指示符

有时我们希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量。为满足这个要求,C++11引入了类型说明符decltype,它的作用是选择并返回操作数的数据类型,此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。

decltype(f()) sum=x;            //sum的类型就是函数f的返回类型
decltype处理顶层const和引用的方式与auto有些许不同,如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内):

const int ci=0,&cj=ci;
decltype(ci) x=0;                 //x的类型是const int
decltype(cj) y=x;                 //y的类型是const int&,y绑定到x
decltype(cj) z;                     //错误:z是一个引用,必须初始化

int i=42,*p=&i,&r=i;
decltype(r)  a=i;                  //a的类型是引用
decltype(r+0) b //b的类型是int,因为虽然r是引用,可是作为表达式的一部分,结果是int类型
decltype(*p) c  //错误:c是int&型,必须初始化,因为如果表达式的内容是解引用操作,decltype得到引用类型//对于decltype来说,如果在变量名上加一对括号,得到的类型与不加括号时的可能有所不同
decltype((i)) d; //错误:d是int&型,必须初始化
decltype (i) e; //正确:e是一个int型值

 
 
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值