现在的位置: 首页 > 综合 > 正文

Effective c++ 读书笔记

2018年04月04日 ⁄ 综合 ⁄ 共 3696字 ⁄ 字号 评论关闭
  1. 在c中,有malloc无free,会导致memory leak;c++中有new无delete亦然。
  2. 如果你在调用new时使用了[],则你必须在调用delete时也使用[];如果你在调用new时没有用了[],那么你也不应该在调用delete时也用[];
  3. #define max(a,b) ((a) > (b) ? (a):(b)) 在使用max(++a,b)时有缺陷。改正:inline int max(int a,int b) {return a > b ? a : b;} 修正:template<class T> inline const T& max(const T &a,const & b)       return{ a > b ? a: b}
  4. scanf准则:如果你准备的不是一个指针,那么必须取其地址;如果是,切勿取其地址。
  5. 类的静态成员绝不应该在类的构造函数中被初始化,因为静态成员是类的共享成员,在每个类对象产生之际就为它们初始化一次是不合理的或是错误的。
  6. 类成员以他们在类中的声明次序来初始化,和他们在初始化列表中的顺序无关。
  7. 对象的数据成员的析构函数总是和他的构造函数相反的次序被调用:先构造的后析构。
  8. 如果一个类内含有一个虚函数,它所派生出来的对象的大小会比无虚函数时的大小多一个指针的大小.//第二版中这个地方有误                                                   
  9. 只有非成员函数产能在其最左端参数上实施类型转换;如果函数f需要在其最左端参数上实施类型转换,f必须定义为非成员函数,如果f同时还必须取用某个类的非公共成员,f应该声明为该类的友元。                                                                                   
  10. const Rational operator*(const Rational&lhs,const Rational&rhs),这样定义可以避免如下情况:Rational a,b,c;(a*b)=c;
  11. 所谓引用(reference)只是一个别名,一个既有对象的名称,任何时候看到一个引用,你都应该立刻问自己,它的另一名称是什么?
  12. NULL在预处理前的定义 #define NULL 0  #define NULL ((void*)0);
  13. 阻止编译器自动产生一个函数的方法是在类的private里面只声明而不定义它。
  14. 定义自己的namespace后,程序员可以以三种方式取用namespace内的符号:一是将namespace的所有符号全部汇入(如using namespace std),二是将个别符号单独汇入(如using std::cout),三是每次使用符号时都明确的加以资格修复。
  15. 不要传回函数内局部对象的引用或函数内以new获得的指针所指的对象。
  16. 声明一个纯虚函数的目的是为了让它的derived class只继承其接口(纯虚函数可以有自己的实现,但只能通过类名显示调用);声明一个虚(非纯)函数的目的是为了让每个derived class可以自由进行特化,并且若在子函数中有意缺省,我们可以通过子类或基类指针(引用)调用base class中的相应虚函数。                                                 
  17. 非虚拟函数都是静态绑定的;绝不要重新定义继承而来的非虚拟函数,如果这样做了,将形成函数覆盖(override)。
  18. 虚拟函数在动态绑定中起作用,这类函数依据对象(指针或引用)的动态类型来调用。函数的缺损参数值是静态绑定的。
  19. 一个空的类在经过c++预处理之后,编译器会自动为你声明一个复制构造或拷贝构造函数(copy constructor)、一个析构函数(destructor)、一个赋值操作符(assignment operator)、和一对取地址运算符(address-of operator)、一个默认构造函数( default constructor )。这些函数都是public和inline类型的。                                          
  20. 对于拷贝构造函数和赋值运算符,当缺损时,一般规则是:缺省的拷贝构造函数(或赋值操作符)对该类的非静态数据成员执行一对一的拷贝构造(或赋值)。也就是说,如果m是class C中的一个类型为T的非静态数据成员,而且C没有声明拷贝构造函数(或赋值操作符),那么m会使用T所定义的拷贝构造函数(或赋值操作符)来进行拷贝构造(或赋值),如果T没有定义自己的拷贝构造函数或赋值操作符,这一规则变递归施行于m的非静态数据成员上,直到找到拷贝构造函数(或赋值运算符),或是遇上内置类型(如int等),缺省情况下内置类型的对象以位拷贝的方式来进行拷贝构造(或赋值)。对继承体系中的类而言,这个规则将施行与继承体系的每一层,所以用户自定义的拷贝构造函数和赋值操作符会在它们被声明的那层被调用。

抱歉!评论已关闭.