最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

全球短讯!69.处理类型

来源:博客园

1.类型别名

随着程序越来越复杂,程序中用到的类型也越来越复杂,这种复杂性体现在两个方面。一是一些类型难于“ 拼写 “,它们的名字既难记又容易写错,还无法明确体现其真实目的和含义。 二是有时候根本搞不清到底需要的类型是什么,程序员不得不回过头去从程序的上下文中寻求帮助。

1.1类型别名

类型别名(type alias)是一个名字, 它是某种类型的同义词。 使用类型别名有很多好处,它让复杂的类型名字变得简单明了、易于理解和使用, 还有助于程序员清楚地知道使 用该类型的真实目的。


(资料图片仅供参考)

有两种方法可用千定义类型别名。 传统的方法是使用关键字typedef:

typedef double wages; / /wages是double的同义词typedef wages base, *p; //base是double的同义词,p是double*的同义词

新标准规定了一种新的方法, 使用别名声明(alias declaration)来定义类型的别名:

using SI = Sales_Item;//SI是Sales_item的同义词

指针、常量和类型别名

如果某个类型别名指代的是复合类型或常佩,那么把它用到声明语句里就会产生意想不到的后果。例如下面的声明语句用到了类型ps七ring,它实际上是类型char*的别名:

typedef char *pstring; const pstring cstr = O;//cstr是指向char的常量指针const pstring *ps;//ps是一个指针,它的对象是指向char的常量指针
const char *cstr = 0;//是对const pstring cstr的错误理解

这种理解是错误的。声明语句中用到pstring时,其基本数据类型是指针。可是用char*重写了声明语句后,数据类型就变成了char,*成为了声明符的一部分。这样改写的结果是,constchar成了基本数据类型。前后两种声明含义截然不同,前者声明了一个指向char的常量指针,改写后的形式则声明了一个指向constchar的指针。

1.2auto类型说明符

C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应一种特定类型的说明符(比如double)不同,auto让编译器通过初始值来推算变量的类型。显然,auto定义的变量必须有初始值:

//由vall和val2相加的结果可以推断出item的类型auto item= val1 + val2;//item初始化为val1和val2相加的结果

此处编译器将根据val1和val2相加的结果来推断item的类型。

使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型都必须一样:

auto i = 0, *p = &i;//正确:i是整数auto sz = 0, pi= 3.14;//错误:sz和pi的类型不一致

复合类型、常量和auto

编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。  首先,正如我们所熟知的,使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。此时编译器以引用对象的类型作为auto 的类型:

int i= 0,&r = i; auto a = r;//a是个整数(r是i的别名,而i是一个整数)

其次,auto一般会忽略掉顶层const(参见C++ Primer2.4.3节, 第57页), 同时底层const则会保留下来, 比如当初始值是一个指向常量的指针时:

const int ci = i, &er = ci;auto b = ci;//b是一个整数(ci的顶层const特性被忽略掉了)auto c = cr;//ie是一个整数(er是ci的别名,ci本身是一个顶层const)auto d = &i;//d是一个整型 指针(整数的地址就是指向整数的指针) auto e = &ci;//e是一个指向整数常责的指针(对常量 对象取地址是一种底层const)

如果希望推断出的auto类型是一个顶层const,需要明确指出:

关键词: