首页 » 读书笔记 » C专家编程

第11章 你懂得C,所以C++不在话下

面向对象的特点是继承和动态绑定。OOP的关键概念:抽象(Abstraction)、类(Class)、对象(Object)、封装(Encapsulation)、继承(Inheritance)。对象也称作实例(Instance)。C语言中头文件就是一种脆弱的封装,它的组合形式是纯语法意义上的,编译器并不知道头文件是一个语义单元。

C++有厨房洗水槽之称。

访问控制的几个关键字:public, protected, private, friend, virtual。我向C++标准化组织提交了一个正式文档(X3J6/93-0121),建议5个关键字都以p开头...virtual应该更名为placeholder,pure virtual(纯虚函数)与访问控制毫无关系,应该更名为empty placeholder...可惜的是,委员会对我的建议并没有做出反应。

::(如std::sort)被称为“全局范围分解符”。

构造函数和析构函数违反了C语言中“一切工作自己负责”的原则。也违背了C语言的哲学:语言的任何部分都不应该通过隐藏的运行时程序来实现。

用类的观点审视C语言的类型体系。类型要么是组合类型(composite type,如数组、struct等),要么是标量类型(scaler type),如数值、枚举、指针等。

继承允许程序员使类型体系结构显式化。多重继承在SmallTalk中不存在,在Eiffel中存在。

重载。重载(overload)指简单复用一个现存的名字,使它操作一个不同的类型。重载总在编译时解析。为了保持程序员的心智健全,应该为一个相似的操作对操作符进行重载,千万不要干诸如下面这种傻事:对*操作符进行重载,让它实际上进行除法运算。

<<和>>用作左右移位操作符,它们被重载用于C++的I/O。I/O操作符的左结合性。

多态(Polymorphism)源于希腊语,意思是多种形状。C++中指对象与适当的成员函数进行运行时绑定。C++通过覆盖(override)实现。判断调用正确函数的过程称为后期绑定(late binding)。通过virtual关键字告诉编译器该成员函数是多态的。

这一章的例子是水果。作者设定的几个成员函数是:削皮(peel)、切片(slice)、榨汁(juice)。作者还真挺有品味的。

class Fruit
{
    public:
        void peel() { printf("peeling a base class fruit\n"); }
};

class Apple : public Fruit
{
    public:
        void peel() { printf("peeling an apple\n"); }
};

Fruit* p = new Apple;
p->peel();       // peeling a base class fruit

多态是一种运行时效果。单继承通过vptr/vtbl实现(vtbl也成为虚表或V表)。

模版(template)被成为编译时的多态。

new真正创建了一个对象,而malloc()只是分配了一块内存。

C++设计目标:往事已矣,且看今朝。这里作者讽刺了Bjarne Stroustrup。1986年Bjarne的论文写道:垃圾收集、参数化类、异常、多重继承对并发的支持以及语言与编程环境的整合(被割舍)...在选择和设计语言的特性时,如果不对其实行严格的限制,其结果就是一堆庞大、笨拙而效率低下的垃圾...最后作者感叹到:啊!那是什么年代啊!那时的美国总统还是里根,那是的西红柿调料酱还是一种蔬菜,树木还是污染的主要来源,C++也没有加入参数化类、异常和多重继承。

编程语言的正交性(Orthogonal),指不同的特性遵循同一个基本原则的程度。C++是反正则性的。《Unix编程艺术》一书也这样指责C++。

与C语言的一些差异:

  • char b[3]="Bob"在C中OK,C++错误。
  • 类型转换可以用float(i),也可以用旧式的(float)i。
  • 允许用常量整数定义数组大小:const int size = 128; char str[size];,这在C中是错误的。
  • 声明可以穿插在语句间。
  • C++中,用户代码不能调用main(),C中允许。
  • C++中,由typedef定义的名字不能与已有的结构标签冲突,C语言允许。
  • 把void*指针赋值给另一类型的指针,C++规定必须强制转换,C却不必。
  • C++中,内层作用域的名字会隐藏外层空间中的同名对象,C却不是如此。
  • C++中,sizeof('a')的值为1,C中被视作int。
  • C++支持//注释,可能会引入一些微妙而古怪的问题。

分享

0