C++必知必会




条款1:数据抽象


数据抽象是将现实生活中的概念映射到代码中,或者是将C++扩展到特定的领域。数据抽象应该基于“这个类是用来做什么的”这个准则。实际操作中步骤为:(1)为类起一个描述性的名字;(2)列出类要执行的操作;(3)为外部提供接口;(4)实现这个类;


条款2:多态


一个良好设计的多态类对于他的每个基类应该是可以替换的。程序应该面向基类而不是具体类,否者应该反思数据抽象的合理性。


条款3:设计模式


设计模式为设计问题提供了解决方案,并描述了解决方案的结果。他表现在代码的结构和组织上,清晰的结构和有序的组织能极大的简化代码编写和维护。他同时为程序之间描述和理解代码提供了便利。


条款4:STL


STL提供了容器和算法以及一些辅助性功能。还为C++提供了一种思想:使用迭代器将数据和操作分离来提高代码的复用性。


条款5:引用是别名而非指针


引用相比指针有3大约束:(1)引用必须初始化;(2)引用不可重新赋值;(3)不存在空引用。不可将非常量的字面值和临时值来初始化引用。引用有时候可以用来简化代码。


条款6:数组形参


数组形参在传入时会“退化”为指向首元素的指针。另外在C++中不同大小的的数组被视为不同类型且不能隐式转化。一般将数组的大小显示的传入函数中。


条款7:指向常量的指针和常量指针


常量指针常被用来指代指向常量的指针。由于const修饰符可以放到被修饰的变量的前后,可能造成定义与理解上的混乱。统一将const后置可以避免这一问题。指向常量的指针可以用来指向非常量,反过来是不被允许的。


条款8:指向指针的指针


在C++中通常利用指向指针的引用来代替指向指针的指针。而且指向“指向常量指针”的指针不可以指向“指向非常量的指针”。^^!最好不用。


条款9:新式转型操作符


const_cast可以移去cosnt修饰符;static_cast可以向下转化来使用子类中特有的接口。dynamic_cast是将多态类型向下转化,要付出相当的运行时代价。reinterpret_cast从位的角度来看待一个对象。


条款10:常量成员函数的含义


在使用const成员函数时,不仅要符合C++语法上的规范,还要遵循C++编程人员的理解习惯。对于确实要在const函数里修改的成员变量,要声明为mutable。


条款11:编译器会在类中放东西


不要对类的内存布局做任何假设。不要利用复制内存来复制类。


条款12:赋值和初始化并不相同


只有到赋值时是赋值,其他情况发生的是初始化。初始化要比赋值快,可以提高效率。


条款13:复制操作


复制构造和复制赋值不一样。但是他们经常混合使用,应该保持一致性。当使用标准容器时尤其重要。


条款14:函数指针


不存在能指向任何函数类型的函数指针,指向内联函数的函数指针编译时不会触发内联机制。通常使用typedef来简化函数指针的定义。


条款15:指向类成员的指针并非指针


声明指向类成员的指针的语法是typename classname:: *,他在表现上相当于一个类的偏移量。指向基类的成员指针可以隐式的转化为指向派生类的成员指针。应为这个偏移量对所有派生类和基类都是有效的。


条款16:指向成员函数的指针并非指针


获取非静态成员函数的地址时,得到的不是一个地址,而是一个指向成员函数的指针。其行为与指向类成员的指针类似。


条款17:处理函数和数组声明


应为数组和函数修饰符的优先级比指针修饰符高,利用typedef可以相当的简化复杂的声明。


条款18:函数对象


函数对象是一个类对象,通过重载()操作符来使它具有类似函数的行为。他比普通的函数强大,而且可能更快。


条款19:Command模式与好莱坞法则


使用函数对象来实现回调是Command模式的一个实例,它可以封装数据获得极大的灵活性。


条款20:STL函数对象


STL的排序通常要搭配一个谓词来使用。普通的函数不能通过内联来加快执行速度。这时可以定义一个函数对象,派生自std::binary_function。通过内联函数来重载()操作符。使用Function()来获得一个匿名的临时对象传入排序函数中。条款21:重载与重写并不相同


在同一个作用域具有相同的名字和不同签名的函数称为重载,在基类的虚函数和派生类中具有相同函数名和签名的函数称为重写。重写操作不当就可能导致屏蔽基类函数。


条款22:Template Method模式


合理的设计基类确定功能,通过继承来定制行为。这需要合理的使用虚函数、纯虚函数、以及访问限定符。


条款23:名字空间


小心谨慎的使用名字空间,避免名字污染和屏蔽。使用匿名的名字空间可以控制只在编译单元内部才能访问。


条款24:成员函数查找


成员函数的查找分为三部,这三部是分别独立的,且不会回溯。首先查找函数名、匹配最佳函数再检测是否有访问权限。


条款25:实参相依的查找


Argument Dependent Lookup, ADL 是指在函数表达式中,编译器会在“包含函数调用的实参的类型”的名字空间中检查函数名。这使得调用重载操作符的函数很便利,但同时也可能屏蔽掉同名函数。


条款26:操作符函数查找


“重载”操作符有两种调用方法。使用普通语法执行的是普通的查找规则,使用中缀调用时会在参数定义的命名空间和全局空间中查找。此时便不是函数的重载而是在不同的命名空间中查找函数。


条款27:能力查询


C++使用dynamic_cast来在一个类的层次结构中执行横向转换,这样就可以判断一个对象是否能具有某些能力。dynamic_case只是偶尔使用。


条款28:指针比较的含义


由于C++中具有多继承,且指向基类的指针能够隐式的转化为指向派生类的指针。因此指针的比较需要借助于一些类型信息才能正确的判断是否指向同一个对象。当赋值给空指针时,就失去了这种信息,只能通过地址来比较指针是否相等。


条款29:虚构造函数与Prototype模式


使用Prototype模式可以快速构建和定制对象。他通常通过一个虚拟的函数来调用复制构造函数来实现。一般命名为clone。


条款30:Factory Method模式


Factory Method的本质在于,基类体统一个虚函数”挂钩”,产生适当的”产品“。每一个派生类可以重写继承的虚函数,为自己产生适当的产品。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值