处理类型

随着程序的越来越复杂,程序中用到的类型也越来越复杂,体现在两个方面:

  • 类型名称难于拼写,名字既难记由容易写错,还无法确定其真实目的是什么
  • 有时候根本不知道所需要的类型是什么,我们必须从上下文寻求帮助

这时候我们主要有三种解决方案:

  1. 类型别名
    类型别名是一个名字,是某种类型的一个同义词。
    传统方法定义别名用的是typedef
typedef double wages;      //wages是double的同义词
wages hourly, weekly;       //等同于double hourly, weekly;

C++11标准规定了一种新的办法,即使用别名声明,using:

using wages = double;    //wages是double的同义词
wages hourly, weekly;     //等同于double hourly, weekly;

这里需要注意的是,假如某个类型别名指代的是复合类型或者常量,那么把它用到声明语句里就会产生意想不到的后果:

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

这里必须要明白,pstring实际上是指向char的指针,所以const pstring就是指向char的常量指针,而非指向常量字符的指针,不能简单的将类型别名替换成他本来的样子

const char *cstr = 0;     //这是对const pstring cstr的错误理解

2.auto类型说明符
在我们编程的时候,常常需要把表达式的值赋值给变量,这要求在声明变量的时候知道表达式的类型,然而这一点是很不容易的,所以C++11引入了auto说明符来帮助我们推断表达式所属的类型,由auto的特性我们知道,auto定义的变量必须有初始值。
这里我们要注意的是,auto可以在同一条语句中声明多个变量,但是一条语句中只能有一个基本数据类型,所以该语句中所有的初始基本数据类型都必须一样

auto i = 0, *p = &i;        //正确,i是整型,p是整型指针
auto sz = 0, pi = 3.14   //错误,sz是整型, pi是浮点型

使用auto我们还必须要注意以下几点:

  • 首先,和我们之前所知道的一样,使用引用其实就是使用引用的对象,特别的是,当引用作为初始值的时候,参与初始化的实际上是引用的对象的值。所以,编译器此时以引用对象的类型作为auto的类型:
int i = 0, &r = i;
auto a = r;               //a是int型(r是i的别名,而i是int型)
  • 其次,auto一般会忽略顶层const,同时底层const会被保留下来:
const int ci = i, &cr = ci;
auto b = ci;                      //b是int型(ci的顶层const被忽略)
auto c = cr;                      //c是int型(cr是ci的别名,ci的顶层const被忽略)
auto d = &i;                      //d是指向int型的指针
auto e = &ci;                     //e是指向int型常量的指针
  • 如果希望推断出来的是一个顶层const,需要明确的指出:
const auto f = ci;      //ci的推演类型是int,而f是const int
  • 还可以将引用的类型设置为auto,此时原来的初始化规则仍然适用:
auto &g = ci;             //g是一个整型常量引用,绑定到ci
auto &h = 42;            //错误,非常量引用不可绑定字面值
const auto &j = 42;   //正确,常量引用绑定字面值

设置一个auto的引用的时候,初始值中的顶层常量属性仍然保留

  • 要在一条语句中定义多个变量,切记,符号&和*只从属于某个声明符,而非基本数据类型的一部分,因此初始值必须是同一种类型:
auto k = ci, &l = i;         //k是int型, l是int型引用
auto &m = ci, *p = &ci;  //m是int型常量引用,p是指向int型常量的指针
auto &n = i, *p2 = &ci    //错误,n是int型引用,而p2必须是指向int型常量的指针,这里确实指向int型的普通指针

3.decltype类型指示符
有时候会碰到这样的情况,我们想用某个表达式的类型定义某个变量,但是不想用该表达式的值初始化这个变量。C++11给我们提供了decltype说明符,它的作用是返回操作数的数据类型。
decltype处理底层const和引用的方式与auto不同。如果decltype使用的表达式是一个变量,那么decltype返回该变量的类型(包括顶层const和引用在内)

const int ci = 0, &cj = ci;
decltype(ci) x = 0;            //x的类型是const int
decltype(cj) y = x;             //y的类型是const int &
decltype(cj) z;                  //错误,z的类型是const int &,必须初始化

下面让我们看一组有趣的情况:

int i = 42, *p = &i, &r = i;
decltype(r + 0) b;
decltype(*p) c

在上述的代码中,decltype(r + 0)返回的类型是int型,这是因为,r作为表达式的一部分,r + 0实际上参与运算的是i + 0,返回的是一个具体的值,而非引用,是int型,但是decltype(r)返回的类型是int &,这点需要明白。

最后一点需要懂得的是,如果decltype使用的是一个不加括号的变量,那么得到的结果是这个变量的类型,一旦加上括号,得到的是引用类型

decltype((i)) d;    //错误,d是一个int &,必须初始化
decltype(i)  e;     //正确,e是一个为初始化的int型变量
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容