Effective c++笔记

1.c++相比c添加了面向对象,模板,STL,是对C的一个升级,也同时兼容C语言。
2.方法中的const变量存在于栈中,全局变量的const存在于常亮区。const会出现在符号表中,而define不会出现在符号表中,会导致调试不方便,define在编译期完成替换
3.const作用于方法,表示方法不能修改成员变量,不能调用非const函数,可以用来重载函数,const会将成员函数也加上const *this。成员函数中static和const是冲突的,如果const和非const函数功能一样,可以让非const调用const函数,使用二次转型。
4.内置对象手工初始化,构造函数内初始化先初始化在赋值,比列表初始要多一步操作,效率低。成员初始化顺序同声明顺序
5.如果不定义,  c++默认定义default构造函数,复制构造函数,拷贝赋值构造函数,析构函数
6.如果不想要使用编译器自动生成的函数,声明为private并不实现。
7.多态基类的析构函数应为虚函数。
8.别让异常逃离析构。如果逃离,在析构对象数组的时候产生异常回导致崩溃。如果必须可能抛出异常,要自己捕捉,并吞下异常。
9.不在析构和构造函数中调用虚函数,构造函数执行时,还是基类对象,不存在子类,调用基类函数。析构函数中调用时,子类已经析构,无法实现多态。
10.令 operator=返回一个*this的引用。
11.在opreator=中处理自我赋值,判断对象地址(this=&src)。如果考虑异常,就先调用复制构造函数复制对象,然后*this和复制对象交换。
12.复制对象要复制对象的一切,重写opreator=编译器是不会帮你检查的。 
13.使用智能指针对象来管理资源的建立和释放。
14.
15 
16.使用new[],使用delete[]释放,new[]表示数组,new表示一个,
17.不要在方法调用中这new一个对象,这样如果异常,这个new出来的对象就找不到了。
18.
19.
20.对象最好以引用const的方式传递,值传递会调用多次构造函数和析构函数,开销过大。
21.operator *要采用值传递,引用传递会导致问题。不能返回本地对象或变量的引用,因为函数返回之后对象被销毁。
22.成员变量最好以private封装,这样可以保持类的封装,隐藏内部实现。通过方法来控制变量读取,通过const方法来让变量只读。
23.以非成员,非友元函数来封装类中的方法,通过声明namespace来实现包含那个头文件 编译哪部分功能。
24.某个函数的所有参数都需要隐式转换,需要声明为非成员函数。explicit可以避免隐式转换。
25.
26.尽量延后变量的定义时间,并以列表的方式初始化,可以避免赋值构造函数的调用。
27.尽量少使用转型操作,const_cast用来去除对象的const dynamic_cast安全的向下转型 reinterpret_cast低级转型,通常用作int*到int  static_cast类似于c语言的转型,强制隐式转换
28.函数加入const代表返回值不可修改。避免返回函数内的局部变量
29.
30.内联函数不一定展开,某些递归循环和虚函数就不会展开。代码直接替换,体积变大,需考虑成本。 
31.声明与实现分开,可以减少编译的依存度。                                                                                                                                                                                                                                                                                                                                                       
32.public继承意味着is a的关系,要注意基类对象的操作要同样适用于子类对象,否则设计不合理,如所有鸟会飞,企鹅是鸟,企鹅也会飞。
33.如果基类中有重载函数,public继承之后,定义重名函数会遮盖重载版本,解决的方法就是使用using声明
34.函数接口继承是要在子类中声明的,而虚函数继承,不需要声明,会默认继承,所以如果子类没有根据需求定义虚函数而采用基类的虚函数实现,这将会带来问题。接口中的非虚函数通常强制子类继承,子类不需要改变。
35.
36.非虚函数静态绑定,指向某个对象的指针就会调用哪个对象的方法,不会发生多态。而虚函数会检查这个指针实际指向的对象,采用动态绑定。 
37.方法缺省参数值是静态绑定的,为了效率,在多态环境下,还是会使用基类的参数初始化多态的函数。
38.复合:类包含别的类、
40.单一继承和多重继承代价相同的情况下优先使用单一继承,虚继承编译器要付出更大的代价,虚继承解决多重继承中的菱形问题。
41.
42.typename和class相同,typename还用来指明嵌套类型的声明

43.

More Effective c++笔记

27. 对象只生成在堆中,将析构函数设置成private。对象只在栈中,operator new设置为private

28. Auto_ptr在复制之后,原对象会失效,以引用传递auto_ptr


猜你喜欢

转载自blog.csdn.net/weixin_36704535/article/details/80605489