C++之类型别名和auto类型说明符、decltype类型

类型别名:

使用类型另外一般就是让复杂的名字变得更简单。

传统方法是使用typedef关键字:

typedef double wages; //现在的wages是double的同义词
wages hight=3.14; //正确,因为wages是double的别名 等价于 double hight = 3.14;
typedef wages base,*p ; //basr是double的同义词,重要的是p是double*的同义词
base sy001 = 3.14;
p sy003=&sy001;

上面最重要的是注意那个*p,它是double*的别名,而不是double的别名,p是一个指针

using

C++11新标准下,规定了一种新的方法:就是使用using,别名声明来定义类型的别名:

using  I =int ; //I就是整形int的别名
I a=0,b=0; //等价于 int a=0,b=0;
I sum=a+b;
using  Ii =int* ;  Ii是一int型的指针

auto类型说明符:

当我们在声明变量的时候不清楚表达式的类型的时候,可用auto自动类型推导。

C++11新标准引入了auto类型说明符,它让编译器代替我们去分析表达式的类型是什么。

auto定义的变量必须有初始值。

auto item= val1 + val2 ; //将item初始化为这两个变量相加的结果
//val1和val2相加的结果可以推导出item变量的类型是什么类型

这个auto是非常方便的,当我们不确定不清楚的时候用它是一个好的选择。

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

不能像下面这样:

auto sz = 0 , pi =3.14;//不能在一条声明语句中同时声明两种不同的类型

auto推导的时候会忽略掉顶层const,底层const会被保留下来。

引用的本质就是起别名。

    int i = 0 , &r = i ;//r是i的别名
    auto  a = r;//经过推导,a的类型是整形
    const int ci = i , &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)

但如果我们希望推导出来的类型是一个顶层const,需要明确指出:

const auto f =ci; //经过推导,ci的类型为int型,f是const int

设置一个类型为auto的引用时,初始值中的顶层常量属性会被保留。如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。

要在一条语句中定义多个变量,符号&和*只从属于某个声明符,并不是基本数据类型的一部分,所经初始值必须是同一种类型:

auto k = ci , &l = i ;   //k是整数,l是整形引用
auto &m = ci, *p =&ci ; //m是对整形常量的引用,p是指向整理常量的指针
auto &n = i , *p2 = &ci ; //错误的,i 的类型是int,但是&ci的类型是const int 

decltype类型指示符:

这个主要用于当我们希望从表达式的类型推断出要定义的变量的类型,但是不想用这个表达式的值初始化变量。

decltype它的作用是:选择并返回操作数的数据类型。

decltype (f()) sum = x;
//sum的类型就是函数f的返回类型

decltype(i),当i是一个变量的时候,则会返回该变量的类型(包括顶层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是一个引用,必须要初始化

decltype和引用:

//decltype的结果可以是引用类型
int i = 42 , *p = &i, &r = i;
decltype (r+0) b; //正确,b是一个末初始化的int型
decltype (*p) c;//错误,c是int&类型的,必须初始化

这里需要注意一下:

//decltype 的表达式如果是加上了括号的变量,结果将是引用
decltype ((i)) d; // 错误, d此时int&型,必须被初始化
decltype (i) e ; //正确,e是一个末初始化的int型

注意:decltype ((variable)) (注意这里是双层括号) 的结果永远是引用,而decltype(variable)结果只有当variable 本身就是 一个引用时才是引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

syhk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值