第2章 变量与基本类型

发布时间 2023-04-18 23:56:22作者: ETHERovo

c++11

  • using -- 2.5.1
  • auto -- 2.5.2
  • decltype -- 2.5.3

2.5 处理类型

2.5.1 类型别名

  • typedef
typedef double aliasOfDouble, *aliasOfDoublePtr, &aliasOfDoubleRef;
  • using
using aliasOfDouble =double;
using aliasOfDoublePtr =double*;
using aliasOfDoubleRef =double&;
  • 类型别名与类型等价
  • 复合类型的类型别名是一个整体,不可拆分来理解
typedef double *aliasOfDoublePtr;
const aliasOfDoublePtr p;
const double *p;//非等价形式,直接拆分是错误的,并非指向常量的指针。
double *const p;//等价的形式,const是用于修饰double*双精度浮点数指针的,因此是常量指针。

2.5.2 auto类型说明符

  • 用于在声明时由编译器根据右值的数据类型推算数据类型
auto i = 0;//int
  • 一条语句可以声明多个变量,但是基本数据类型必须相同
auto i=0, *p=&i; //正确,都是整形
auto x=0, y=1.1; //错误,基本类型不同
  • 引用作为右值实则是其引用的对象,所以auto是其引用对象的数据类型,而非引用类型
  • 上面说到auto不会是引用类型,那么自动类型的引用通过auto &实现
int y = 10;
auto & x = y;
  • 同为复合数据类型的指针,既可以使用auto,也可以使用auto *
  • auto忽略右值的顶层const,不会忽略底层const。
  • 如果希望包含顶层const,则需要明确指出
const auto x = 10;
  • 对于auto &,保留顶层const。

2.5.3 decltype类型指示符

  • decltype()使得编译器不必进行表达式或者函数计算,而是取其返回值的数据类型作为自动类型,这样一来变量可以初始化为其他值;
decltype(f()) sum = x;
  • decltype的自动类型包含引用和顶层const,不同于auto
  • 因为decltype可以生成引用类型,如果要使得其生成引用所指的类型,可以将其作为表达式的一部分
int i=10, &r=i;
decltype(r+0) b;
  • 解引用操作的返回类型是引用类型
int i=10, *p=&i;
decltype(*p) b;//错误,b是一个int&,需要初始化
  • 变量加括号(x)是一个表达式,返回值是可以作为左值的x的引用
decltype((i)) d;//错误,d是一个整形引用,需要初始化