欢迎来到天天文库
浏览记录
ID:57731734
大小:154.08 KB
页数:4页
时间:2020-03-25
《《C++编程风格》学习笔记.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C++编程风格(C++ProgrammingStyle)(美)TomCargill著聂雪军译第0章概述由于内联函数的展开所增加的代码量甚至可能降低程序的执行速度,因为代码量的增加有可能妨碍有效的代码缓冲操作。只有当内联函数确实能够带来程序性能的提升时,才应该被用在代码中。第1章抽象类实现的函数代码不应该显式地依赖于组件是否存在,而应该对每种组件进行统一的处理。(自己的理解:在类层次中,处于相同层次上的派生类,应该使他们的行为一直,这样便于对各个派生类进行统一处理)将共同的抽象提取出来并放到基类中
2、。通常来说,对象的行为是指它对外部激励的反应。如果从对外部激励反应的角度来考察一个对象,我们强调的是对象的独立性——在程序的执行期间,每个对象都是程序的一个自治实体。最普遍的外部激励形式就是成员函数的调用,而对象将通过执行成员函数来作出反应,或者是完成某个功能,或者是返回一个值,或者二者都有。多态——虚函数——可以使得不同类型的对象对相同的外部激励产生不同的反应。一个类应该能够描述一组对象。如果派生类之间的区别在于属性,则用数据成员来表示;如果在于行为,则用虚函数来表示。使用数据成员来表示属性之
3、间的区别,要比使用虚函数的表示更加易于编程。如果通过公有继承来产生派生类,那么这个派生类应该是其基类的特化。将派生类之间的不同之处局限在初始化过程中(构造函数的特化)是一种使用继承的正确方法。程序员们不应该只是因为C++提供了更为复杂的编程技术而放弃那些标准的和可靠的编程技术。多态并不是所有程序设计问题的解决方案。第2章一致性设计一个类时,程序员通常需要从类的接口和类的实现两个方面来考虑,接口必须能够代表一致的抽象,而实现则必须使得对象在行为上与这个抽象保持一致。接口和实现可以通过不同的模型来表
4、示对象状态,这也分别称之为逻辑状态和物理状态。逻辑状态模型通常是物理状态模型的简化,多个物理状态可以对应于一个逻辑状态。构造函数应似的对象处于明确定义的状态。通常来说,用默认参数的形式来代替函数重载的形式,可以使得程序更加易于维护。即我们应该考虑使用默认参数的形式来代替函数重载的形式。对于每个类,我们都可以写出一组类不变性(classinvariant)条件,在类的每个对象的生存期内,这些条件都应该是成立的。我们首先在构造函数中建立起类不变性,然后在其他成员函数中维持这个不变性,这样就在对象的整
5、个生存期内都保持了类不变性。因此,用一致的方式来定义对象的状态——这需要识别出类不变性。(可以将类不变性作为注释,写在类的定义中)类的接口定义应该是一致的——避免产生困惑。避免对从不使用的状态信息进行计算和存储。即只有当信息在后续操作中需要被用到时候,才应该被存储。在定义operator=时,我们要注意x=x这种情况第3章不必要的继承如果基类的析构函数没有被声明为虚函数,我们动态创建一个派生类对象,并通过基类类型的指针来删除这个对象时,将只会调用基类的析构函数。私有继承不但能够防止基类的公有接口
6、成为派生类公有接口的一部分,还能够防止将基类型的指针或者引用指向派生类的对象。任何对私有基类成员的访问都是非法的,同样,将任何私有基类型的指针或者引用指向派生类对象也是非法的。在私有基类中,派生类继承了所有的实现,但没有继承任何接口。而在继承公有的抽象基类时,派生类继承了所有的接口,但所继承的实现可能是不完整的或者是不存在的。我们要识别出对实现的继承;可以使用私有基类或者(更好的方法是)使用成员对象(即将私有基类作为派生类的一个数据成员)。第4章虚函数类设计中的一致性:(1)在接口上保持外部一致
7、性(2)在每个对象状态的实现上保持内部一致性(3)在使用继承时,在基类以及派生类接口之间的一致性。派生类在处理继承而来的状态时,必须与基类保持一致。如果在公有基类中没有定义虚析构函数,那么在所有的派生类或者派生类的数据成员中都应该没有定义析构函数。(在多重继承时,这条规则将是不充分的)通常情况下,公有基类的析构函数应该被声明为虚函数。基类所描述的应该是基类对象和派生类对象中共同抽象的所有属性。如果在基类中包含了共同的状态和行为,那么一个简单的描述就可以服务于许多的派生类。如果我们没有识别出共同的
8、属性并将它们放到基类中,那么这些属性在每个派生类中都将被重复定义。这种重复性将使得程序难以进行编写、阅读和维护。类的设计原则:降低耦合性——将类之间的交互最小化数据与函数:通常,把信息记录在数据中比记录在函数中要更为简单,并且非虚的函数要比虚函数更加容易理解。当我们要决定在一个类中到底是使用数据成员还是函数成员来表示一个特性时,我们首先应该考虑:•这个特性是由属性值来描述的还是由行为来描述的?如果这个特性是一个属性值,那么用数据成员来表示就更简单。派生类对象将继承这个数据成员,并可以使用它的值。
此文档下载收益归作者所有