文档章节

《C++覆辙录》——1.9:使用糟糕的语言

乱蓬头
 乱蓬头
发布于 2017/06/02 14:09
字数 1058
阅读 2
收藏 0

摘要: 本节书摘来自异步社区出版社《C++覆辙录》一书中的第1章,第1.9节,作者: 【美】Stephen C. Dewhurst(史蒂芬 C. 杜赫斯特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

本节书摘来自异步社区出版社《C++覆辙录》一书中的第1章,第1.9节,作者: 【美】Stephen C. Dewhurst(史蒂芬 C. 杜赫斯特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.9:使用糟糕的语言

当一个更大的世界入侵了C++社群原本悠然自得的乐土之时,它们带来了一些足堪天谴的语言和编码实践。本节乃是为了厘清返璞归真的C++语言所使用的正确适当、堪称典范之用语和行为。

用语
表1-1列出了最常见的用语错误,以及它们对应的正确形式。

表1-1 常见用语错误及其对应正确用语

0253e977f2ccbddb6f1047be7cfce0428cbddaf1

没有什么所谓“纯虚基类”。纯虚函数是有的,而包含有或是未能改写(override)此种函数的类,我们并不叫它“纯虚基类”,而是叫它“抽象类”。

C++语言中是没有“方法”的。JavaSmalltalk里才有方法一说。当你颇带着一丝自命不凡地就面向对象的话题侃侃而谈之时,你可能使用像“消息”和“方法”这种用语。但如果你开始脚踏实地,开始讨论你的设计对应的C++实现时,最好还是使用“函数调用”或“成员函数”来表达。

还有一些不足为信的C++专家(是在说你吗?)使用“destructed”作为“constructed”的对应词。这明显是英语没学好35,正确的对应词是“destroyed”。

C++ 语言中确实有强制型别转换(或曰型别转换)运算符——事实上只有4个(static_castdynamic_castconst_cast以及reinterpret_cast)。遗憾的是,“强制型别转换运算符”常常被不正确地用于表达“成员型别转换运算符”,而后者指定了某种对象何以被隐式地转换到另外的型别。

class C {
  operator int *()const; // 成员型别转换运算符
  //...
};```
当然用强制转换运算符来完成型别转换的工作也是允许的,只要你不把用语搞混就成。

请参见常见错误31中有关“常量指针”和“指涉到常量的指针”的讨论,以加深对本主题的理解。

空指针
从前,当软件工程师使用预处理符号`NULL`来表示空指针时,他会遭遇潜在的灾难:

void doIt( char * ); 
void doIt( void * ); 
C *cp = NULL;```
麻烦出在NULL这个符号在不同的平台上,有很多种定义的方法:

#define NULL ((char *)0)
#define NULL ((void *)0)
#define NULL 0```
这些各扫门前雪的不同定义严重损害了C++语言的可移植性:

doIt( NULL ); // 平台相关抑或模棱两可?
C *cp = NULL; // 错误?``
事实上,在C++语言里是没有办法直接表示空指针的。但我们可以保证的是,数字字面常量0可以转换成任何一种指针型别对应的空指针。那也就是传统的C++语言保证可移植性和正确性的用法36。现在,C++标准规定像(void *)0这样的定义是不允许的37,可见这是个和NULL的使用并无多大干系的技术问题(如若不然,NULL`岂不是成了格外受人青睐的预处理符号?其实它是普通不过的)。可是,真正领会了C++语言精神的软件工程师仍然使用字面常量038。任何其他用法都会使你显得相当非主流。

缩略词
C++软件工程师都有缩略词强迫症,不过与管理层相比,可谓小巫见大巫。表1-2在你的同事给你来上一句“RVO将不会应用到POD上,所以你最好自己写个自定义的复制ctor”时能派上用场。

表1-2 常用缩略词的意思

3d914fe90ba47faef017e1350da0164d5c91bafe

本文转载自:http://click.aliyun.com/m/22336/

乱蓬头
粉丝 0
博文 382
码字总数 2595
作品 0
私信 提问
Dart 1.9 发布,新正则引擎,性能提升显著!

Dart 1.9 发布,异步编程无处不在 —— 用户交互,网络访问,文件 I/O。Dart 简化和增强了这些功能。 Dart 1.9 引入了 方法和 表达式,都是基于现有的 API。Dart 1.9 可以使用: 循环, 块和...

oschina
2015/03/28
4.4K
14
五大原因导致 Google 放弃在 Chrome 中使用 Dart 语言

最新发布的 Dart 已经非常接近下版本 Dart 1.9,它加入了众人期待的 Dart 1.9 中的特性,如:异步/等待和 Dart 分析服务器,实际上,发布的时候它并没吸引到众人的眼光。为什么呢?主要是因...

oschina
2015/03/28
10.7K
24
从 Java 到 Go,再到 Java

介绍: Cassandra 中的适应值曲面原理——局部最优趋势 在Lisp中, 你并不仅仅针对语言编程,你同时针对编程建造语言. 当你编码时,你可能会想“我想要Lisp 有这样那样的操作.”所以你写下代码....

灰大羊
2016/10/21
6.2K
2
Go 1.10 的发布说明草案:预计于 2018 年 2 月发布

Go 1.10 还没发布,下面将简单介绍正在进行中的 Go 1.10 发布说明草案。 Go 1.9 已于 2017 年 8 月发布,最新的 Go 1.10 预计将于 Go 1.9 发布六个月后 —— 2018 年 2 月发布。 Go 1.10 大部...

局长
2017/11/18
7.1K
23
Neo4j 1.9.M01 发布,自管理的高可用性

Neo4j 1.9 发布了首个里程碑版本,该版本值得关注的就是带来了简化的高可用性的集群管理,另外在查询语言 Cypher 也做了改进。 Neo是一个网络——面向网络的数据库——也就是说,它是一个嵌入...

oschina
2012/11/02
722
0

没有更多内容

加载失败,请刷新页面

加载更多

vue v-html动态生成的html怎么加样式

1. v-html加样式 在vue开发中碰到需要动态生成html,并且需要有样式,这时候发现像往常一样写样式的时候不起作用,网上搜了一下,发现通过 v-html 创建的 DOM 内容不受作用域内的样式影响,但...

litCabbage
32分钟前
3
0
Appium+python自动化(三十三)- 测试环境和本地环境傻傻滴分不清楚-Remote(超详解)

  简介   在前边所有涉及启动app的时候有这样一行代码driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps),很多小伙伴们和同学们不知道这个ip和端口哪里来的,我...

开源仔
40分钟前
1
0
各种放大器电路之功率放大器的分析

  供给负载一定输出功率的放大器叫做功率放大器。它是收音机、扩音机或其他电子设备的末级,它推动扬声器发出声音,使电动机转动,使记录仪表动作等。功率放大器主要是考虑如何获得最大的输...

xyxyty
40分钟前
3
0
MySQL8.0.17 - Multi-Valued Indexes 简述

本文主要简单介绍下8.0.17新引入的功能multi-valued index, 顾名思义,索引上对于同一个Primary key, 可以建立多个二级索引项,实际上已经对array类型的基础功能做了支持 (感觉官方未来一定...

阿里云官方博客
今天
13
0
make4.1降级 make-3.81、2错误

在编译 make-3.82 的时候出现如下错误提示 glob/glob.c:xxx: undefined reference to `__alloca'` 修改 /glob/glob.c // #if !defined __alloca && !defined __GNU_LIBRARY__ # ifdef __GNUC......

Domineering
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部