C ++11出现了更好的两种数据类型,C++11中的空指针与强类型枚举

好玩,有趣,专业C/C++学习交流,源码下载 群:747821062

虽说C++现在17了,但是还是讲下C++11中两个类型吧,C ++从一开始就尝试改进C的类型系统,添加类可以构建更好的类型和枚举的类,这样就不需要预处理器的某些用途(这在类型上并不安全)。C ++还为您执行更少的隐式类型转换(例如不允许从void *进行隐式赋值),让编译器为您找到更多错误。C ++ 11更进一步,即使枚举摆脱了整数#define常量的需要,我们仍然有丑陋的,输入不良的NULL指针。C ++ 11通过添加一个具有自己类型的显式,清晰的nullptr值来清除这一点。C ++ 11还带来了新的强类型枚举。在本文中,我将介绍这些改进。

为什么我们需要强类型枚举?

好玩,有趣,专业C/C++学习交流,源码下载 群:747821062


1.那么为什么我们还需要强类型的枚举?

旧式C ++枚举基本上是整数; 它们可以与整数或其他不同类型的枚举进行比较。问题是,你通常不想这样做,因为枚举应该是一些固定的枚举值列表。

2.为什么要与其他枚举类型(或整数)进行比较?

这就像说,“请把这种指甲与这种牙刷比较。” 这没有任何意义,你可能并不是故意这样做。但旧式的C ++枚举会很高兴地告诉你,“为什么是,这个指甲不像这个牙刷”,或者更糟糕的是,它们可能比较相同,因为它们碰巧共享相同的基本整数值(“啊是的,这个指甲是电子牙刷“)。现在,使用强类型枚举,编译器会告诉您正在执行此操作。如果你真的是这个意思。另一个限制是枚举值是无范围的 - 换句话说,您不能有两个共享相同名称的枚举:

好玩,有趣,专业C/C++学习交流,源码下载 群:747821062


强类型枚举

强类型枚举是一种新的枚举,声明如下:

好玩,有趣,专业C/C++学习交流,源码下载 群:747821062


使用单词class意味着每个枚举类型确实不同,并且与其他枚举类型不可比。强类型枚举,枚举类,也有更好的范围。每个枚举值都在enum类的名称范围内。换句话说,要访问枚举值,您必须写:

好玩,有趣,专业C/C++学习交流,源码下载 群:747821062


旧式C ++枚举仍然可用, 如果您需要它们, 主要是为了与现有代码库向后兼容,他们确实拿起了一招; 你现在可以选择将枚举名称放在值的前面:Color :: RED。但由于这是可选的,因此无法解决任何命名冲突; 它只是让它更清晰一点。

与旧式枚举相比,枚举类具有另一个优点。您可以向强类型枚举进行前向声明,这意味着您可以编写如下代码

好玩,有趣,专业C/C++学习交流,源码下载 群:747821062


为什么这会有用?前向声明通常是关于磁盘上代码的物理布局到不同文件中,或者提供不透明对象作为API的一部分。在第一种情况下,您关心物理磁盘布局,使用转发声明允许您在将特定值放入cpp文件时在头文件中声明枚举类型。这使您可以非常频繁地更改可能的枚举值列表,而无需强制重新编译所有相关文件。在第二种情况下,枚举类可以作为类型安全公开,但从一个API函数返回的其他不透明值将传递到另一个API函数。使用API​​的代码不需要知道类型可以采用的可能值。由于编译器仍然知道类型

明确定义的枚举大小

枚举类的最后一个优点是可以设置枚举的大小 - 您可以使用任何有符号或无符号整数类型它默认为int,但您也可以使用char,unsigned long等。这将确保编译器之间的兼容性。

enum class Colors : char { RED = 1, GREEN = 2, BLUE = 3 };

但是在C ++ 11中,我们可以做得更好,使用cstdint指定枚举的确切大小

C ++遇到的一个问题是缺乏提供固定的,定义明确的大小的标准类型。例如,有时您希望拥有一个32位整数,而不仅仅是一个在不同体系结构上可能具有不同大小的int。在C ++ 11中,C99头文件stdint.h已作为cstdint包含在内。cstdint头包括诸如std :: int8_t,std :: int16_t,std :: int32_t和std :: int64_t之类的类型(以及以u:std :: uint8_t开头的无符号版本)。

下面是一个将这些新类型与枚举类组合在一起的示例,以便在编译器和体系结构中获得完全已知的枚举大小:

#include

enum class Colors : std::int8_t { RED = 1, GREEN = 2, BLUE = 3 };

空指针

好玩,有趣,专业C/C++学习交流,源码下载 群:747821062


在C和C ++中,表达NULL指针的想法总是很重要 - 一个没有值的指针。奇怪的是,在C ++中,使用的表达式0(或NULL,总是#defined为零)甚至不是指针类型。尽管这在大多数情况下起作用,但它可能导致奇怪和意想不到的问题,不可否认的是,边缘情况。例如,假设您有以下两个函数声明:

void func(int n);

void func(char *s);

func( NULL ); // 会调用那一个?

虽然看起来第二个函数将被调用 - 毕竟,你传递的似乎是一个指针 - 它实际上是第一个被调用的函数!麻烦的是因为NULL是0,而0是一个整数,所以将调用第一个版本的func。这是一种事情,是的,它不会一直发生,但是当它确实发生时,是非常令人沮丧和困惑的。如果您不知道发生了什么的细节,它可能看起来像编译器错误。看起来像编译器错误的语言功能,不是你想要的。

输入nullptr。在C ++ 11中,nullptr是一个新的关键字,可以(并且应该!)用于表示NULL指针; 换句话说,无论你以前写过NULL,都应该使用nullptr。对于程序员来说,你不再清楚(每个人都知道NULL意味着什么),但它对编译器来说更加明确,当用作指针时,编译器不会再看到任何地方被用来具有特殊含义的0。

顺便说一下,nullptr不仅被声明为指针并且隐式转换为所有指针类型(和bool),但它是它自己特殊的,不同的类型:

decltype( nullptr )

虽然我们可以使用decltype来提取其类型,但还有一个更方便的表示法:

std::nullptr_t

由于nullptr是它自己的唯一类型,因此当您想要确保只为值获取空指针时,可以将它用作构造函数或函数参数。例如:

void func( std::nullptr_t );

声明一个只接受nullptr(或者一个值转换为std :: nullptr_t)的函数,而不是其他任何东西,一个相当巧妙的技巧

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

推荐阅读更多精彩内容