2.5 处理类型
2.5.1 类型别名
1. 关键字typedef
typedef double wages; typedef wages base, *p; //base是double的同义词 p是duble*的同义词
2.别名声明
using SI = sales_item; wages hourly, weekly; SI item;
指针 常量 类型别名
typedef char *pstring; const pstring cstr = 0; //cstr是指向char的常量指针,并不是将const pstring cstr = 0简单的替换成const char *cstr = 0 const pstring *ps; //ps是一个指针,指向的对象是指向char的常量指针
上述两条语句的基本数据类型都是const pstring ,const是对给定类型的修饰。pstring实际上是指向char的指针,因此,const pstring是指向char的常量指针。
2.5.2 auto类型说明符
auto能让编译器替我们去分析表达式所属的类型,通过初始值来推算变量的类型,所以auto定义的变量必须有初始值。
auto i = 0, *p = &i; //T.i是整数,p是整型指针 auto z = 0, pi = 3.14; //F. sz和pi类型不一致
复合类型 常量 auto
使用引用是使用引用的对象,引用被用作初始值时,真正参与初始化的其实是引用对象的值。此时编译器以引用对象的类型作为auto的类型
int i = 0, &r = i; auto a = r; //a是一个整数 //auto一般会忽略顶层const。保存底层const const int ci = i, &cr = ci; anto b = ci; //b是一个整数 auto c = cr; //c是一个整数 auto d = &i; //d是一个整型指针 auto e = &ci; //e是一个指向整数常量的指针(对常量对象取地址是底层const) const auto f = ci; //ci的推演类型是int。f是const int auto &g = ci; //g是一个整型常量引用,绑定到ci auto &h = 42; //F. 不能为非常量引用绑定字面值 const auto &j =42; //可以为常量引用绑定字面值 auto k = ci, &l = i; // T k是整型 l是整型引用 auto &m = ci, *p = &ci; // T m是对整型常量的引用,p是指向整型常量的指针 auto &n = i, *p2 = &ci; // F.i的类型是int而&ci的类型是const int
2.5.3 decltype类型指示符
希望从表达式的类型推断出要定义的变量的类型,但不想用该表达式的值初始化变量。decltype并不实际计算表达式的值。
decltype(f()) sum = x; //sum的类型即函数f的返回类型decltype 处理顶层const和引用的方式与auto有些许不同。
const int ci = 0, &cj = ci; decltype(ci) x = 0; //x的类型是const int decltype(cj) y = x; //y的类型是const int& ,y绑定到变量x decltype(cj) z; //F. z是一个引用,必须初始化 //引用从来都作为其所指对象的同义词出现,只有用在decltype处是个例外
decltype 和引用
int i = 42, *p =&i, &r = i; decltype(r+0) b; //T b是int decltype(*p) c; //F c是int& 必须初始化
defltype((i)) d; //F d是int& defltype(())结果永远是引用 defltype(i) e; //T e是int defltype()只有当表达式本身是引用时才是引用
浙公网安备 33010602011771号