(9)处理类型

来源:互联网 发布:mac qq发送文件特别慢 编辑:程序博客网 时间:2024/06/03 07:15
类型别名:是一个名字,它是某种类型的同义词。
C++有两种方法用于定义类型别名:

一.使用关键字typedef:

typedef  int iname;iname a =1 ;  //可用iname定义变量 ,a是一个整型变量
二.使用别名声明(using)来定义类型的别名:

using iname = int;iname  a =1;
使用类型别名有很多好处,它让复杂的类型名字变得简单明了,易于理解和使用,还有助于程序员清楚的知道使用该类型的真实目的。


如果某个类型别名指代的是复合类型或者常量,那么把它用到声明语句里会产生意想不到的结果。例如:

typedef char* pstring;const pstring cstr = 0;//cstr是指向char的常量指针const pstring *ps;//ps是一个指针,它的对象是指向char的常量指针。
到这里会有很多人把常量指针和常量的指针搞混,我在前一节也指出了两者的区别,现在我来解释一下为什么上面是一个常量指针,而不是一个常量的指针。其实理解这个不难,类型别名就是起了另一个名字实际东西并没有改变,所以有人习惯的去把char *带入到const pstring cstr = 0;这个语句去理解,得到的是一个指向char常量的指针,这是大错特错!起了别名你就需要把他们当做一个整体来看,pstring = char *.pstring就是一个指向字符的指针。前面加了const,const修饰的是这个指针,所以是一个常量指针。但是如果把char * 带进去,const修饰的是char,所以是一个指向char的常量的指针。


auto类型说明符:
给变量赋初值或赋值时,我们都需要知道变量的类型,避免类型不匹配。但是这在实际编程中会引起不少的麻烦事。为了解决这个问题
C++引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。
因为auto让编译器通过初始值来推算变量的类型,所以auto定义的变量必须有初始值。如:

auto i= 1;auto a= 1,b =3.14; //错误,变量列表的类型必须一致


auto与复合类型、常量:
一.如果auto初始值是个引用,编译器以引用对象的类型auto的类型。
二.auto一般会忽略到顶层const,同时底层的const则会保留下来.
int  i=0,&r = i;const  int ci = i,&cr= ci;auto b = ci;    //b是整数auto c = cr;//c是整数auto d = &i;//d是整数指针auto e = &ci;//e是指向整数常量的指针
三.如果希望推断出来的auto类型是一个顶层的const,需要明确指出

const auto f = ci;   //推演的ci是int f是const  int 

decltype类型指示符
有时候会遇到这种情况:希望从表达式的类型推断出要定义变量的类型,但不想用该表达式的值初始化变量。这时候需要用到decltype,它的作用是选择并返回操作数的类型。如:
decltype(f()) sum =x;//sum的类型就是函数f()的类型
编译器不调用函数f,而是使用当调用发生时f的返回类型作为sum的类型。


decltype处理顶层const和引用与auto不同,如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内):

constint  ci = 0,&cj = ci;decltype(ci) x = 0;//x的类型是const int decltype(cj) y =x;//y的类型是const int&,y绑定到变量x
注意:引用从来都是作为所指对象的同义词出现,只有在decltype处是一个例外。

想得到引用指向对象的类型,可以将引用作为表达式的一部分如:cj+0,显然这个表达式的结果将是一个具体值而非一个引用。

如果表达式的内容是解引用操作,则decltype将得到引用类型,因为解引用指针可以得到指针所指的对象,而且还能给这个对象赋值。

decltype(variable)结果只有当variable本身是个引用时才是引用,而decltype((variable))(两层或多层括号)的结果永远是引用

0 0