1.类型别名
a.传统方法:关键字typedef
typedef int newType; //newType 是int的同义词
typedef newType *p; //p是int*的同义词
b.新方法:别名声明(alias declaration),使用 using
using newType=int; //newType是int的同义词
当某个类型别名指代的是复合类型或常量,不能把它带入声明语句中。
typedef char *pstring;
const pstring cstr=0; //cstr是指向char的常量指针 同等于char * const cstr =0;
cosnt pstring *ps; //ps是一个指向char的常量指针的指针
pstring 实际上是指向char的指针,所以const pstring 是指向char的常量指针。
2.auto类型说明符
auto是C++11新引入的类型说明符,用它能让编译器替我们去分析表达式所属的类型。
auto让编译器通过初始值来推断变量的类型。(初始值是引用对象时,初始类型判断为所引用的对象的类型)
auto 声明语句中的所有变量的初始基本数据类型必须一致。
auto 一般忽略掉顶层const,保留底层cosnt。
const int a=0;
auto b=a,&c=a; //b是int,c是int类型a的引用 (a的顶层const 被忽略掉了)
auto d=&a; //d是指向整数常量的指针(对常量对象取地址是一种底层const)
3.decltype类型指示符
C++引入说明符decltype,用来从表达式中的类型推断出要定义的变量类型,并且不需要用该表达式的值初始化变量(不然可以用auto)。
decltype(f()) a; //用f()返回值类型定义a
decltype(a) b; //用a对应的类型定义b
decltype推断方式:
a.表达式时一个变量时,decltype返回该变量的类型(包括顶层const和引用)。
decltype(f()) a; //用f()返回值类型定义a
decltype(a) b; //用a对应的类型定义b
注意:decltype((variable))(双层括号)的结果永远是引用。
若表达式求值结果是左值时,返回值对应的类型的引用类型。若表达式求值结果是右值,返回值对应的类型。
(左右值简单归纳:当一个对象被用作右值得时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置))
(左右值简单归纳:当一个对象被用作右值得时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置))
(一般来说,可以放在赋值操作符左边的是左值,可以放在右边的而是右值
)
(左值表示程序中必须有一个特定的名字引用到这个值。右值表示程序中没有一个特定的名字引用到这个值除了用地址。)
decltype(f()) a; //用f()返回值类型定义a
decltype(a) b; //用a对应的类型定义b