1.struct成员默认访问方式是public,而 class默认访问方式是private!
2.exit函数终止程序执行会调用析构函数 ,abort函数终止程序不会调用析构函数!
3.静态局部变量直到程序终止时才退出!
4.通过public 函数返回 private成员的引用有可能会破坏类的封装 ,造成外部变量可以改变类私有成员值!
5.常量对象只能调用常量成员函数,常量成员函数可以有非常量版本重载!
6.常量数据成员只能在定义时初始化或者在构造函数里用成员初始化值来初始化 ,不能用赋值语句来初始化!
7.要在析构函数里面使用delete来释放使用 new申请的内存空间!
8.编写析构函数来释放类中成员所申请的内存空间和使用深拷贝函数是好的编程习惯!
9.operator++()是相当与++d,operator++(int) 是相当于 d++ !
10.如果父类中函数是虚拟函数 ,那么在每个子类中显式声明虚拟函数是好的编程习惯!
11.如果类作为基类,其析构函数要声明为虚析构函数 ,这样派生类才可以调用自己的析构函数!
12.一个new 就对应一个 delete是好的编程习惯!
13.istream输入read 是从文件中读取 ,ostream输出write 是写到文件中去!
14.istream是seekg 重置文件指针位置 ,ostream是seekp, 文件用file.eof()来判断是否读取到文件尾部!
15.assert(条件), 当满足条件时就不 assert,不满足条件才会assert!
16.对于不需要修改的变量,使用常量引用来传递参数可以既保证安全性又保证效率!
17.在循环之前调用srand(time(0)),然后在循环中调用 rand()函数可以使得每次随机的结果都不相同!
18.一维数组形参如下:int a[],二维数组形参如下 :int a[][SIZE],第一个[] 是空的,后面必须非空!
19.#define A 10 后面没有分号!
20.在局部函数中用new创建的变量是存在内存中的,即便局部函数执行完毕内存变量仍然存在,但是指向它的指针有可能是局部变量,则需要在局部函数结束前调用 delete释放内存空间,以免内存泄漏
21.数组声明最好用 T *a 来声明 ,这样不容易出错,创建对象最好用 new 而不是直接创建!
22.定义一个类时,析构函数(释放资源)和拷贝构造函数(深拷贝)最好显示定义!
23.C/C++语言输入结束符是ctrl+z(windows下 )!
24.C语言的printf(“%.9lf”,a); 比c++的 setprecision(10)来的更加精确,C++有时自动舍入精度!
25.理清状况,逻辑严谨,变量初始化、是还是否、边界判断判断正确!
26.要使得栈中的基本元素是模板类类型,必须要定义模板类的一些函数:默认构造函数,友员输出函数等!
27.用单件模式和全局函数替代全局变量,以便于拓展和维护!
28.用const char ptr 表示ptr指向的变量为常量。 char const ptr表明ptr 本身为常量是好的编程习惯!
29.const int *i = &a, 只是代表不能通过 i指针来修改,但是可以通过其它途径来修改 a,例如a=3 !
30.灵活熟练运用语言,如 (a<b?a:b<c?b:c) = val();这句话就将3 个if语句合并成一句话!
31.桥接模式bridge 可以实现接口与实现分离 ,这样可以减少修改类时需要修改的类的范围!
32.优先级:i++ 高于 ++i ,注意,具体运算符优先级看下面的运算符优先级表!
33.递归算法符合大致算法思想就行了 ,不必深究思考,合理就可以了!
34.在C++ 中使用0来对指针初始化可以保证数字字面常量 0可以转换成任何一种指针类型对应的空指针!
35.非const 对象可以调用 const和非const 函数,但是 const对象只能调用const函数!
36.可以使用非const 类型变量赋给 const类型参数,不能用const类型变量赋值给非 const类型参数!
37.类重载二元运算符时,要么作为类的只带一个参数的内部函数 ,要么作为类中带两个参数的友元函数!
38.内建的operator-> 是二元的 ,而重载的operator-> 是一元的 ,如果重载了operator-> 则先调用重载的 ,直到重复调用到内建的operator->才终止!
39.尽量使用STL 是好的编程习惯!
40.++i返回的是内存变量,可以作为左值也可以作为右值 ,而i++ 返回的是字面量 ,不占内存, 不能作为左值右值!
41.for循环中使用continue 不会出现死循环 ,但是while 中使用continue容易出现死循环 ,因为可能i 没有自加!
42.取最大优先分析原则会取最长的类型 ,所以要这么义:list<vector<string> > lovos;右边两个>> 之间必须有空格 ,如果没有则编译器可能解释成 >>右移操作符!
43.对于平凡整型常量,可以用枚举量来表示!
44.派生类赋值给基类是不要使用对象继续赋值 ,而是使用指针或引用以避免发生截切!
45.不使用 void * 为类型转换的中介类型是良好的编程习惯 ,因为void * 会抹除指针的类型信息!
46.使用引用类型或标准库组件以避免引入多级指针的复杂性是较佳的设计!
47.在类对象中尽量避免使用二级指针 ,尤其是在基类指向派生类对象的指针时尤其要注意!
48.在C++ 类中尽量不要重载类型转换 operator函数, 而是使用有明确含义的如 toInt(),toChar()等函数替代!
49.C++中有时在类构造函数前加上 explicit关键字来禁止隐式类型转换可以减少很多错误!
50.多用引用传递参数,用值传递时会有大量的复制操作 ,效率很低, 多用引用是好的编程习惯!
51.函数对象就是重载了operator()的 class对象, 使用函数对象生成匿名临时对象是好的编程习惯!
52.使用dynamic_cast<>,static_cast<>,const_cast<>,reinterpret_cast<> !
53.在派生类构造函数中尽量多使用成员初始化列表 ,静态数据成员和数组不允许在成员初始化表中进行初始化 ,可以在函数体中进行初始化!
54.在类中涉及到指针和引用等 ,最好显示撰写深拷贝构造函数和赋值运算符重载 operator=(),以免出现错误!
55.子类在继承父类时如果重写父类的虚函数或者非虚函数 ,要保证在子类中重写的函数访问修饰符和父类结合继承访问后得到的访问修饰符结果一致!
56.在写拷贝构造函数和重写赋值运算符函数时必须把类中所有变量都用 '='号显示写全了,不要写一部分 ,如果你没写, 则编译器只会调用默认构造函数进行变量初始化 ,而不会默认用'='号!
57.尽量不要在类中使用静态变量 ,永远不要做运行期静态初始化!
58.对class 对象或者有可能是 class对象的实体进行直接初始化而不是用赋值语句初始化 ,如:N n(0)!
59.搞清楚复制初始化和赋值初始化的不同 ,复制初始化是调用拷贝构造函数实现 ,而赋值是重载'='实现!
60.可以通过在private 区域声明拷贝构造函数来禁止类的复制初始化!
61.对象作为参数尽量使用引用传递 ,其次考虑指针,尽量不要用值传递 ,如果不想修改对象可以加 const!
62.抛出匿名临时异常对象,并以引用的方式捕获它们 ,如需重新抛出,则抛出既有的异常对象 ,而非处理原始的异常之后 ,抛出一个新的异常对象!
63.不要返回函数作用域内所分配的存储的引用(返回指针或直接传值可以) ,会造成内存泄漏!
64.使用类的构造函数和析构函数来封装一些成对的操作如加锁和解锁等 ,这样在函数执行开始时创建类对象 ,使用A a; 而不适A a();或 A()来创建, 在函数结束前会自动删除改对象 ,也就实现了开始时调用加锁操作 ,结束时调用解锁操作,俗称 RAII(资源获取即初始化)!
65.复制auto_ptr 模板实例化对象将指向的对象的控制权转移 ,然后把复制源设为空!
66.永远不要把auto_ptr 实例化的类型作为 STL容器的基本类型!
67.不要将auto_ptr 对象作为函数参数按值传递 ,会清空原有对象,造成不可预知的错误!
68.不要在虚函数中提供参数的默认初始化物!
69.访问层级(public protected private) 对重写虚函数没有任何影响 ,即使public 继承,你也可以将继承过来的本来应该是 public的函数写到private 作用域中 ,完全可以!
70.派生类中对基类中的非虚函数的重写或重载其实是遮掩 ,会将基类中同名的所有虚函数和非虚函数全部遮掩 ,使之无效, 这时想要构成重载 ,必须使用using A::fun() 函数来导入基类中 fun函数!
71.重载必须在同一个类作用域下才构成重载 ,否则只是遮掩!
72.重载虚函数要么对基类中的每一个都重写要么一个都不要重写 ,或者使用using A::fun() !