一、类型别名
使用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类型