最近在看c++高级编程 ,把从这书书中学到的编程思想和编程方法 分享给大家,大家在一起也感悟一下
一 :使用关键字continue会使程序跳转到循环的开始处,使用关键字break会使程序跳出循环,这两种方式打破了循环,使程序实现了任意跳转。这是不好的编程风格。
二:在c++中,尽量避免使用#define,而倾向于使用const来定义常量。Const引用参数的主要意义在于它能提高效率,向一个函数传递一个变量时,会建立一个完整的副本,如果传递一个引用,只是传递了原变量的指针,这样计算机就无需为之建立副本,通过传递一个const引用,能尽享这两方面的优势,不用建副本,而且建立的对象也不会被修改。
使用指针而不是引用有很多优点:
1) 引用比指针更安全,因为引用不会直接处理内存的地址,而且不会NULL
2) 在风格上,引用也比指针有优越性,因为引用使用的是栈变量的语法,避免了使用*等符号,引用更容易使用!
(3)在编写程序之前,先不要写具体任何代码,而应当首先设计程序,你要使用什么数据结构,编写什么类?在团队中这显得尤其重要!
三:(1)程序设计文档(程序体系结构规范)
1)将程序按部分划分为多个子系统,包括子系统间的接口和依赖关系,子系统间的数据流。在各系统之间来回的输入和输出,以及总的线程模式
2)各个子系统的具体细节,包括进一步细分的类、类的层次体系、数据结构。算法。特定的线程模式和错误处理细节
在编程时遇到困难时的结解决方案
(1)在程序设计的过程中如果遇到问题,可以向导师。同事。求助
(2)查阅参考书 ,浏览网页
(3)与别人合作一段时间,再来看以前的设计方案
(4)做出决定,继续设计
四:C++设计原则
(1)抽象
关键考虑接口和实现
(2)重用(代码重用和思想重用)
标准数据结构 、算法和模式,了解c++标准库中的代码,以及任何可供使用的专用代码
大o记法(适用于速度依赖于输入的算法)
用来说明算法和库的性能,主要来说明算法性能随着输入规模增大时带来的变化!
五:代码格式
(1)大括号对齐(2)小括号和空格(3)建议使用总是使用将制表符解释为4个空格的编辑器
六:Static成员和成员函数
(1)静态方法并不是在一个特定的对象上调用,他没有This指针,而且不能对一个特定的对象来访问非静态成员!
七:切割问题:产生在向上类型转换的过程中!
如果直接把继承类赋给基类,会对继承类进行切割,但是如果把继承类赋给基类的引用或基类的指针就不会产生切割!这种方法也称为向上类型转换。
只有在必须并且能保证使用动态类型转换的时候才能使用向下类型转换!
八:关键字explicit的作用
关键字explicit可以禁止“单参数构造函数”被用于自动类型转换
class Stack
{
explicitStack(int size);
};
没有explicit的话Stack s = 40;能编译通过
而有explicit则不能,必需Stack s(40);
九:关于运算符重载的一点常识
1)定义类的运算符函数时,只有在运算符的左侧是该类时,才能被调用,若左侧不是该类,则调用会出现问题
2)为避免调用出现的问题,可以把运算符重载函数定义为全局的函数,这样对左侧 。右侧的数据就不回产生影响了
十:使用接口和实现类
接口和实现分离的好处是,可以让接口更清晰,又隐藏实现的细节。但不好的地方在于,这可能会带来安全隐患。基本的原则是,分别定义两个类:一个接口类,一个实现类。实现类和写的普通类没区别,接口类提供了实现类所提供的方法,但它只有一个数据成员,即指向实现类对象的指针。接口类方法实现只是只是调用实现类对象上对应的方法
十一:有关继承的技巧
(1) 不要犹豫,将所有的方法声明为virtual函数,以备将来在子类中扩展
(2) 超类的引用或者指针知道是它的一个子类,也不能调用超类中所没有的的方法或成员
(3) 超类指针或引用在引用子类时,子类仍会保留它们覆盖的方法,而在强制转换为超类对象时,子类会丧失它们的独有特性。覆盖方法和子类数据的都是称为切割
十二:协变返回类型:
在c++中,只要原来的类型是指向类的指针或引用,新的类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型。
也就是说 以前函数中如果返回对象,该对象是啥类型就返回啥类型的对象,在继承的时候这样做是可以的,即返回类型是基类指针或引用,而实际返回的却是它的子类对象