处理类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wk_bjut_edu_cn/article/details/81951764

类型别名


定义类型别名有两只方法,分别是:

使用关键字:typedef (传统方法)
使用关键字:using (新标准)

typedef char* pstring;
const pstring cstr = 0; // cstr 是指向char的常量指针(**const被识别为顶层const**)

using int32_t = int;  //int32_t是int的同义词

auto类型说明符


c++ 11 新标准引入了auto类型说明符, 用它就能让编译器替我们分析表达式所属的类型。另外,因为一条声明语句只能有一个基本类型,所以该语句的所有变量的初始基本类型都必须一样。

auto i =0, *p = &i;
auto i = 0, j = 3.14;  // 错误,i和j的类型不一致。

在一些情况下数组的操作实际上是指针的操作,比如下面当使用数组作为一个auto变量的初始值时,推断得到的类型是指针而非数组。

int ia[]={1,2,3,4,5};
auto ia2(ia);    //ia是一个整型指针,指向ia的第一个元素
ia2=42;    //错误,ia是一个指针

但是,当使用decltype关键字时上述转换不会发生,decltype(ia)返回的类型是由10个整数构成的数组:

int *p,i=6;
decltype(ia) ia3={1,2,3,4,5};
ia3=p;    //错误,不能用整型指针给数组赋值
ia3[4]=i;    //正确,把i的值赋给ia3的一个元素

注意:定义数组的时候必须指定数组的类型,不允许用auto关键字由初始值的列表推断类型。 

decltype


c++ 11 引入了decltype, 它的作用是选择并返回操作数的数据类型。在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。 decltype 使用 表达式是一个变量时,会返回该变量的类型(包括顶层const和引用)

另外, 我们知道 解引用指针 可以得到指针所指的对象, 而且还能给这个对象赋值, 所以 decltype(*p) 的结果是int& 而非 int.

const int ci = 0;
decltype(ci) x = 0;     // x的类型是const int
decltype(cj) y = x;     // y的类型是const int&,y绑定到变量x
decltype(*p) c;         // 错误,c是int&, 必须初始化

下面的r是一个引用,因此decltype(r)的结果是引用类型。如果想让结果类型是r所指的类型,可以把r作为表达式的一部分,如r+0,显然这个表达式的结果将是一个具体值而非引用。 

int i=42;,&r=i;
decltype(r+0) b;//正确:加法的结果是int,因此bb是一个(未初始化的)int型

decltype((variable)) 的结果永远是引用,而decltype(variable)结果只有当variable本身就是一个引用时才是引用。

decltype((i)) d;   // 错误,d 是int&, 必须初始化
decltype(i)   e;   // 正确,e 为int

猜你喜欢

转载自blog.csdn.net/wk_bjut_edu_cn/article/details/81951764