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()只有当表达式本身是引用时才是引用

 

 
posted @ 2017-05-27 00:13  1ww3  阅读(245)  评论(0)    收藏  举报