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

版权声明:本文章刊载的内容,多数为读者作者笔记,笔记内容来自于潭州教育提供的学习资源以及读者本人阅读的文章,特此声明! https://blog.csdn.net/qq_41453285/article/details/85764918

一、类型别名

类型别名:是一个名字,它是同种类型的同义词

两种方法可用于定义类型别名

  • 关键字:typedef
  • C++11新标准中的:using

1.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;

2.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;

3.指针、常量和类型别名关系

如果某个类型别名指代的是复合类型或常量,那么要注意以下的特殊情况

typedef char* pstring;

char s = 'A';
const pstring cstr = &s;
const pstring *ps=&cstr;
printf("%c", **ps);//打印A
  • 在上面的代码中,cstr是指向char的常量指针。而ps是一个指针,它的对象是指向char的常量指针

二、auto类型说明符

1.概念:编程时常常需要把表达式的值赋值给变量,这时候就要清楚表达式的值,但是如果不知道表达式的类型就很麻烦。因此C++11引进了auto类型说明符,就能让编译器替我们去识别表达式的类型

2.auto的用法与注意事项

  • auto定义的变量必须有初始化值:因为编译器是通过初始化的值来判断变量的类型的
  • 声明多条语句时,变量的类型要一致

3.基本用法

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的数据类型不一致

4.复合类型、常量和auto

编译器推断出的auto类型有时候和初始值的类型并不完全一样,编译器会改变结果类型使其更符合初始化规则

扫描二维码关注公众号,回复: 4795700 查看本文章

①引用

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

三、decltype类型指示符

1.概念:decltype选择并返回操作数的数据类型,可以不初始化值

2.注意

  • decltype返回的类型与括号内的结果有关,而与括号内的数据类型无关
  • 并且decltype有很多方面需要注意,下面会详细介绍

3.基本用法

decltype(f()) sum=x;
//如果f()是一个函数,则sum的类型就是f函数返回值的类型
//注:编译器并不实际调用函数f,而是直接获取其返回值类型

4.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&

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/85764918
今日推荐