高效C++读书笔记【一】

来源:互联网 发布:js 获取translatey 编辑:程序博客网 时间:2024/06/09 19:36

前言:

1、拷贝构造函数和赋值拷贝赋值运算符

拷贝构造函数和赋值拷贝运算符之前的区别:

拷贝构造是使用已经存在的对象初始化一个新的对象

拷贝赋值就是使用同型的对象中拷贝其值到本对象

2、使用const/inline/enum 替代#define

1、由于#define是在编译阶段把程序中所有的相关的名字直接的替换成响应的数据,导致在当程序出现问题时出现魔数2、常量指针的定义需要注意的格式问题,原则就是去掉类型符号,const离谁斤就是修饰谁的3、类的专属常量的定义:    类的专属的常量使用const修饰在类的内部,为了该数据至此一份,使用static修饰,例如:    const  static  int aa;    需要注意的是,上面是该常量的声明而不是定义,你需要在源文件中给出他的定义,对其进行赋值:    const  class tmp::aa  =0;

3、尽可能使用const

1、const 可以声明基本上C++内部的所有的数据的类型、函数、类成员函数、类的数据成员2、const修饰指针变量标识该指针变量不可以改变,也可以修饰指针指向的对象3、const可以修饰迭代器,标识不可以对一个迭代器进行修改4、const修饰函数的返回值,标识不可以对一个函数的返回值就行修改,赋值等操作5、const修饰类的成员函数:    格式:在函数的声明和定义函数参数列表后面加上关键字const修饰    const修饰类的成员函数是保证其可以使用类中的const数据成员6、类中的const数据成员不可以直接在类中初始化,只有static修饰的静态数据才能使用直接初始化       const修饰的数据成员只能通过类的构造函数的参数初始化列表初始化。

4、初始化

1、对于内置类型的数据对象记住最好是初始化。2、对于自定义的数据类型,需要在构造函数内部对该类型内部的数据成员进行初始化。3、

注意从下面开始都是简单的做些记录

5、构造函数、析构函数、拷贝构造函数、赋值运算符

6、如果不想使用系统默认生成的一些函数,就应该明确的声明

1、系统会为一个类默认的生成一些函数,包括构造函数、析构函数或者拷贝构造函数和拷贝运算符这些,如果不想让系统默认的生成的话        就自己定义,并且把他们声明为privated的

7、为基类声明virtual函数

1、如果一个类打算作为一个多态的基类,那么对于其中的函数,最好是声明为virual,如果一个基类有virtual声明的函数,那么则需要一个virtual的析构函数2、

8、不要再析构函数中吐出异常:

1、析构函数中的异常尽量不要吐出,因为析构函数往往做的事情就是对内存中的数据进行释放,如果由于中间的某一个操作导致的程序异常,则必然造成内存的溢出

9、不要再构造函数中调用virtual 函数,由于在基类中调用virtual函数的时候派生类还没有生成,会导致许多不可预知的错误

10、让赋值运算符返回一个指向当前对象的引用

1、赋值运算符是可以实现连续赋值的,为了实现这个目标,在运算符重载的时候需要范围指向操作符左侧的数据的引用

11、拷贝构造函数的重写需要注意的问题:

1、确保对所有的当前类的所有的数据成员都进行了拷贝,包括所有的基类的数据成员也进行了拷贝2、不要尝试使用一个拷贝构造函数去实现另外一个拷贝构造函数,因为如果真的这样做了,你不能保证,后面的那个拷贝构造函数永远都是前一个的子集,       最好的办法就是把他们共同的技能都放在同一个函数中,由这两个拷贝构造函数调用。

12、使用对象管理内存:

1、C++允许用户自己申请和管理处于堆中的内存空间,由new创建、使用delete删除2、用户自己管理内存的危险就在于,时长会出现忘记释放的情况3、使用对象管理内存的关键就是:1、申请到的内存立即放进对象 2、使用对象的析构函数自动的释放内存4、比较常用的是:std::auto_ptr 和std::tr1::shared_ptr    格式: std::auto_ptr<类型>  指针名 =  所指对象的地址

13、接口的设计需要考虑的是容易容,并且不会被勿用

1、接口说明2、接口名形象化

14、

16、成对的new 和delete需要使用相同的方式

17、用独立的语句把new出来的对象至于只能指针中

18、函数的参数传递尽量不要使用引用或者是指针传递代替直接的船体对象,避免内存开销和提升效率

19、把数据成员声明为privated

    封装性

23、使用非成员函数代替成员函数

1、如果一件事情,增加一个成员函数或者是增加一个非成员函数都可以达到要求,尽量去新加一个非成员函数    愿意就是,新加一个成员函数只会导致类的封装性降低,然而非成员函数并不会    另外,新加一个成员函数也会导致类的拓展性降低,我们尽量保证类内的数据成员有单一的接口,尽量少的接口访问他,这样对于后期的拓展的工作量是有好处的。

24、尽量延后变量的实际的定义出现的时间,可以避免不必要的构造和结构所带来的开销以及花费的时间。

后续、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

原创粉丝点击