您当前的位置: 首页 >  c++

暂无认证

  • 3浏览

    0关注

    92582博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++:68---C++11标准(类型处理:using、auto、decltype)

发布时间:2019-01-04 12:35:14 ,浏览量:3

一、类型别名
  • 类型别名:是一个名字,它是同种类型的同义词
  • 两种方法可用于定义类型别名:
    • 关键字:typedef
    • C++11新标准中的:using
typedef
  • 用法如下:
typedef double wages; //wages是double的同义词
typedef wages base,*p; //base是double的同义词,p是double*的同义词

wages number=3.14; //double number=3.14;
p=&number; //double* p=&number;
using
  • 新标准中规定了一种新的方法,使用别名声明来定义类型的别名
  • 用法如下:
using SI=double; //SI等价于double
using p_SI=double*; //p_SI等价于double*

SI number=3.14; //double number=3.14;
p_SI p=&number; //double* p=&number;
指针、常量和类型别名关系
  • 如果某个类型别名指代的是复合类型或常量,那么要注意以下的特殊情况
typedef char* pstring;

char s = 'A';
const pstring cstr = &s;
const pstring *ps=&cstr;
printf("%c", **ps);//打印A
  • 在上面的代码中,cstr是指向char的常量指针。而ps是一个二级指针,它的对象是指向char*指针的常量指针
二、auto类型说明符
  • 概念:编程时常常需要把表达式的值赋值给变量,这时候就要清楚表达式的值,但是如果不知道表达式的类型就很麻烦。因此C++11引进了auto类型说明符,就能让编译器替我们去识别表达式的类型
  • auto的用法与注意事项
    • auto定义的变量必须有初始化值:因为编译器是通过初始化的值来判断变量的类型的
    • 声明多条语句时,变量的类型要一致
  • 基本用法
auto a=10; //auto是int
auto b='A'; //auto是char
auto i=0,*p=&i; //正确,i是整型,p是整型指针
auto s2=0,pi=3.14; //错误,s2与pi的数据类型不一致
复合类型、常量与auto的使用
  • 编译器推断出的auto类型有时候和初始值的类型并不完全一样,编译器会改变结果类型使其更符合初始化规则
  • ①引用
int i=0,&r=i; //i是一个整型,r是一个引用
auto a=r; //a是一个整型
  • ②auto一般会忽略顶层const,保留底层const
const int ci=0,&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)
  • ③&与*只是声明符,而非基本数据类型的一部分
int i=0;
const int ci=1;

auto k=ci,&l=i; //k是整数,l是整数引用
auto &m=ci,*p=&ci; //m是整型常量的引用,p是指向整型常量的指针
auto &n=i,*p2=&ci; //错误:i的类型是int,而&ci的类型是const int
  • 5.其他
int arr[]={1,2,3};
auto arr2(arr);     //arr2是int*类型
auto arr3(&arr[0]);//arr3也是int*类型
三、decltype类型指示符
  • 概念:decltype选择并返回操作数的数据类型,可以不初始化值
  • 注意
    • decltype返回的类型与括号内的结果有关,而与括号内的数据类型无关
    • 并且decltype有很多方面需要注意,下面会详细介绍
  • 基本用法
decltype(f()) sum=x;
//如果f()是一个函数,则sum的类型就是f函数返回值的类型
//注:编译器并不实际调用函数f,而是直接获取其返回值类型
decltype处理顶层const与引用
  • ①.处理const int类型
const int ci=0,&cj=ci;
decltype(ci) x=0; //x的类型是const int
decltype(cj) y=x; //y的类型是const int&
decltype(cj) z;//错误:z是一个引用,必须初始化值
  • ②.处理引用:如果decltype处理的是一个表达式,则decltype返回表达式结果对应的类型
int i=42,&r=i;
decltype(r) x=i;//x的类型是int &
decltype(r+0) y=i;//y的类型是int,因为r+0返回的是一个整型
  • 如果decltype处理的类型加上多层括号,则返回的是引用
int i=10;
decltype(i) x=i;//x为int类型
decltype((i)) y=i;//y为int&类型
  • 如果decltype处理的是解引用操作,则decltype将得到引用类型
int i=42,*p=&i;
decltype(*p) x=i;//x类型为int&

关注
打赏
1653961664
查看更多评论
立即登录/注册

微信扫码登录

0.3988s