2.5处理类型

一、类型别名

使用typedef定义类型别名

typedef 原类型 类型修饰符类型别名

其中,类型别名是被类型别名前的类型修饰符修饰过的原类型的别名,且一句话可以定义多个类型别名,如:

typedef int *p, base;
//base 是int的别名,p是int* 的别名

其中typedef是关键字

C++11新特性:使用using定义别名

using 别名 = 原来类型名

其中using是关键字

别名的一体性

对于复合类型,一旦定义了其别名,则别名在使用时候就具有一体性,不能再拆开,如下:

typedef char *p;  //p为复合类型char *的别名
const char *a;    //这是一个指向常量char的指针,属于底层const
const p b;  
//b是一个p类型,即p是指向char的指针,然后再被const限定
//则变成了指向char的常量指针,和a的定义是有区别的
const p *c;
//这个更复杂,从右到左解读,首先c是一个指针
//然后c是一个指向类型p的指针,即c指向的对象时一个指向char的指针
//然后const是底层const,则c指向的对象是一个常量
//因此c是一个指针,指针的对象时指向char的常量指针

二、C++11新特性:auto类型说明符号

auto用于非引用类型推断

在定义变量时候,使用auto作为变量的类型,则编译器会根据初始值自行推断变量类型,定义格式如下:

auto 变量名 = 初始值;
  • auto定义的变量必须进行初始化
  • 一个auto可以定义多个变量,但这些变量的基本数据类型必须一样,注意const int 和int是两种基本数据类型;而int int型引用,int型指针的基本数据类型是一样的,均为int,这是由于引用和指针均为类型修饰符
auto a = 2, b = *a, c = &a;
//其中a为int,b为指向int的指针,c为int类型引用,其基本类型均为int
  • 当引用作为初始值时,auto则参照被引用的原对象确认类型:
int a = 1, &b = a;
auto c = b;//b是a的引用,a是int型,所以auto代表int
  • auto在分析类型的时候会忽略顶层const,而保留底层const
const int a = 1;
int A = 1 ; 
const int *b = &a;  //b是底层const,是指向int常量a的指针
int *const c = &A;  //c第顶层const,是指向int的常量指针
auto B = b;   //底层const保留,B是指向int常量的指针
auto C = c;   //顶层const被忽略,C是指向int的指针
  • 如果需要auto为顶层const,则需要显示写出
const auto 变量名 = 初始值

auto用于引用类型推断

基本规则与auto用于非引用类型推断相同,唯一有区别的是auto用于引用的类型推断时,初始值的顶层const得到保留。

const int a = 1;
const auto &b = a;  //正确,使用const引用来引用const int常量
auto &c = a;   //错误,a的顶层const得到保留,必须显示声明auto是const

三、decltype类型指示符

decltype(操作数)将操作数的类型返回,但不返回操作数的值,格式如下:

decltype(操作数) 变量名 = 初始化值;
  • decltype()中操作数的类型是啥就是啥,包括顶层const和引用在内到会返回
int a = 1 ;
int const *b = a;  //顶层const,b是int型常量指针
int &c = a;        //c是int型引用
decltype(b)        //保留了顶层const,返回int型常量指针
decltype(c)        //保留了引用,返回int型引用
  • 这里需要注意的是引用一般都可以直接换成被引用的对象,但只有decltype这里引用和被引用对象在decltype中返回的结果是不一样的
  • decltype((a))返回的是a的类型的引用,中间多加的括号相当于一个引用
  • 但引用参与运算后则变成了被引用的对象,不再是引用了:
int a = 1, &b = a;
decltype(b+1)   
//这里的引用b参与了运算,相当于换成了a
//表达式最后的值是一个int类型,因此返回的是int类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值