2.5处理类型

处理类型

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=10auto 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&型,必须初始化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值