0. 导读 摘录

本书探讨了如何编写易理解和维护的C++软件,强调设计策略和语言特性。内容涵盖声明式、定义式、初始化、构造函数、赋值操作、STL、线程安全和命名约定等主题。还提到了TR1和Boost库在C++中的作用,以及如何避免未定义行为,确保代码质量。
摘要由CSDN通过智能技术生成

本书的目的是使你的软件易理解、易维护、可移植、可扩充、高效、并且有着你所预期的行为。

我所提出的忠告大致分为两类:一般性的设计策略,以及带有具体细节的特定语言特性。

本书告诉你如何结合那些成分以便最终获得有效程序。本书告诉你如何回避编译器难以显露的问题。

术语(Terminology)

所谓声明式(declaration)是告诉编译器某个东西的名称和类型(type),但略去细节。

extern int x;                        // 对象(object)声明式
std::size_t numDigits(int number);   // 函数(function)声明式
class Widget;                        // 类(class)声明式

template <typename T>                // 模板(template)声明式
class GraphNode;

即使int是内置类型,我也将其称为对象。

size_t只是一个typedef,是C++计算个数时用的某种不带正负号(unsigned)类型。

每个函数的声明揭示其签名式(signature),也就是参数和返回类型。一个函数的签名等同于该函数的类型。但是C++官方对签名式定义不包括返回类型。

定义式(definition)的任务是提供编译器一些声明式所遗漏的细节。对对象而言,定义式是编译器为此对象给定内存的地点。对function或function template而言,定义式提供了代码本体。对class或class template而言,定义式列出它们的成员。

初始化(initialization)是"给予对象初值"的过程。对用户自定义类型的对象而言,初始由构造函数执行。所谓default构造函数要么没有参数,要么就是每个参数都有缺省值。

将class的给定一个参数的构造函数声明为explicit,可阻止它们被用来执行隐士类型转换(implicit type conversions),但它们仍然可以用来执行显式类型转换(explicit type conversions)。

被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎,因为它们禁止编译器执行非预期(往往也不被期待)的类型转换。

copy构造函数被用来”以同型对象初始化自我对象“,copy assignment运算符被用来”从另一个同姓对象中拷贝其值到自我对象“

当你看见copy assignment运算符时请小心,因为它也能可以用来调用copy构造函数。例如

Widget w2 = w1;

如果一个新对象被定义,一定会有个构造函数被调用,不可能调用赋值操作。如果没有新对象被定义,就不会有构造函数调用,那么当然就是赋值操作被调用。

bool func(Widget w);
...
Widget wdg;

if (func(wdg))
...

参数w是以by value方式传递给func函数,所以在上述调用中实参wdg被复制到形参w体内。这个复制操作是由Widget的copy构造函数完成。pass by value意味着调用copy构造函数。

stl是所谓标准模板库(standary template library),是C++标准库的一部分,致力于容器。迭代器,算法及相关机能。许多相关机能是以function objects实现,那是”行为像函数“的对象。这样的对象来自于重载operator()function call运算符的class。

某些C++构件的行为没有定义,undefined behavior。记住带有不明确行为的程序会抹煞你的辛勤努力。

另一个可能会造成困惑的术语是接口(interface)。当我使用术语"接口"时,我一般谈的是函数的签名(signature)或class的可访问元素,或是针对template类型参数需为有效的一个表达式。

所谓客户是指某人或某物,他使用你写的代码。函数的客户是指其使用者,也就是程序中调用函数(或取其地址)的那一部分,也可以说是编写并维护那些代码的人。class和template亦如此。

命名习惯(naming conventions)

例如对于二元操作符函数而言,我最喜欢的两个参数名称,rhs(right-hand side)和lhs(left-hand side)。

对于成员函数,左侧实参由this指针表现出来。

我常将”指向一个T型对象“的指针命名为pt,意思是pointer to T。

对于reference,我使用的类似的习惯,rw可能是个reference to Widget。

关于线程(threading consideration)

线程安全性是许多程序员要面对的主题。

TR1和Boost

TR1(Technical Report 1)是一份规范,描述加入C++标准库的诸多新机能。这些技能以新的class templates和function template形式体现,针对的题目有hash table,reference-counting smart pointers,regular expressions,以及更多。所有的TR1组件被置于tr1内,其嵌套于命名空间std内。

Boost是个组织,也是一个网站,提供可移植、同僚复审、源代码开放的C++程序库。大多数TR1机能是以Boost的工作为基础。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值