> 文章列表 > C++学习笔记

C++学习笔记

C++学习笔记

C++学习笔记

  1. 函数一般有返回值,构造函数有没有返回值?有返回值,返回一个对象,确定所以没写;
  2. 在头文件中,防卫式声明,#ifndef…#define … #endif;
  3. pass by value或者 reference,传值是整包传递,引用的底部就是指针,效率更高;
  4. 构造函数一般放在public中,能不能放在Private,可以,设计模式中的singleton就用了这个用法;
  5. 不改变数据的类中函数可以加const;
  6. 什么情况下不能传引用,返回值不能返回引用;
  7. 构造函数可以用初始化列表;
  8. 传递者无需知道接收者是以引用形式接收的;
  9. 拷贝赋值函数,必须检测是不是自我赋值,如果是自我赋值可以提高效率,不检测上来就是delete,会删除要赋值的元素,没法赋值;
  10. 带指针的class必须有拷贝构造、拷贝赋值、析构函数;
  11. 堆里开辟的内存必须手动删除; delete先调用析构函数,再释放内存(执行operator delete 源代码是free());new先分配内存,再转型然后调用构造函数;
  12. i++是先用临时对象保存原来的对象,然后对原对象自增,再返回临时对象,不能作为左值;++i是直接对于原对象进行自增,然后返回原对象的引用,可以作为左值;++i由于不用生成临时变量,且以引用方式返回,故没有构造与析构的开销,效率更高。所以在使用类等自定义类型的时候,应尽量使用++i。i++是先赋值,然后再自增;++i是先自增,后赋值;
  13. 带指针的类,需要关注big three ,拷贝构造、拷贝赋值和析构函数,拷贝构造参数可以加const(没改变原来的数据可以加) ,函数不能加const(在new新的东西出来)。
  14. 复合关系下的类,构造由内向外,调用的是默认构造函数,不满足要求需要自己写,析构由外向内。继承也是如此;
  15. 非虚函数(non -virtual):不希望子类重新定义她;
  16. 虚函数(virtual):希望子类重新定义它、且你对他已经默认定义;
  17. 纯虚函数(pure-virtual):希望子类重新定义它、且没有默认定义;
  18. exlict 90%以上用在构造函数前面,在模板中也可能用到;
  19. 变量能且只能定义一次,但可以声明多次;
  20. 引用必须初始化,引用并非对象,只是为一个已经存在的对象所起的另一个名字(引用即别名);
  21. 空指针,例如int *p=nullptr等价于int *p=0;
  22. 搞清楚改变的是指针的值还是指针指向对象的值,最好的方法是记住赋值永远改变的是等号左侧的对象;
  23. 常量指针必须初始化,一旦完成初始化,就不能再改变(存放在指针中的那个地址不能再改变了)。
  24. 指针的类型要和它所指向的对象类型严格匹配(两种特例除外);
  25. string的=初始化一个变量,实际上执行的是拷贝初始化,如果不使用等号,则是直接初始化;
  26. 多余的空语句并非都是无害的,例如循环体后的空语句。
  27. switch语句最好在后面加一条break语句;
  28. 返回值和引用的区别,函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本;
  29. const总结:1、用const 修饰函数的参数;2、用const 修饰函数的返回值;3、const 成员函数(const的作用:说明其不会修改数据成员);
  30. const 成员函数的声明看起来怪怪的:const 关键字只能放在函数声明的尾部,例如 int GetCount(void) const; // const 成员函数;
  31. 关于Const函数的几点规则:a. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数;b. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的;c. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查;e. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的;
  32. 常量指针,声名格式:const * 类型名 指针名 ;这根指针不变,但是指向的对象可以改变;
  33. 指针常量
  34. 相同class的各个对象互为友元。
  35. auto一般会忽略顶层const,底层const会保留,如果推断出auto是一个顶层const那么需要明确指出。引用也可以设置成auto;
  36. decltype处理引用、const和auto处理引用、const的方式不太一样;