博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《C++覆辙录》——1.9:使用糟糕的语言
阅读量:5758 次
发布时间:2019-06-18

本文共 1471 字,大约阅读时间需要 4 分钟。

本节书摘来自异步社区出版社《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://tltkx.baihongyu.com/

你可能感兴趣的文章
Struts+Tomcat搭建
查看>>
Lua数据结构的学习笔记
查看>>
Android 各层调用的方式
查看>>
puppet重申证书
查看>>
分类和回归区别
查看>>
TED Notes 1 (What leads to success)
查看>>
C++类模板
查看>>
MVC分页
查看>>
.NET MVC学习笔记(一)
查看>>
OpenRisc-67-OR的汇编
查看>>
微信公众平台开发(96) 多个功能整合
查看>>
[转]MVC4项目中验证用户登录一个特性就搞定
查看>>
c#取得应用程序根目录
查看>>
我的MYSQL学习心得(十二) 触发器
查看>>
(转)Overview : Writing Scripts in C# 使用C#书写脚本
查看>>
用Perl编写Apache模块续二 - SVN动态鉴权实现SVNAuth 禅道版
查看>>
Android 阴影,圆形的Button
查看>>
来自于确定的苦闷
查看>>
特殊用途语言特性——默认参数、内联函数和constexptr函数
查看>>
临界段CCriticalSection的使用
查看>>