接着昨天的笔记继续..

规范补充##

  1. 作为名称使用时,缩略词不得全部使用大写,如exportHtmlSource()优于exportHTMLSource()
  2. 避免复杂的bool表达式,使用临时变量。
  3. 避免TAB或分页符的出现

类拷贝构造函数

原型: ClassName (ClassName&) ClassName (const ClassName&)

  1. 初始化变量时,不论使用ClassName obj1(obj2) 或是 ClassName obj1 = obj2 均会调用构造函数
  2. 赋值时变量时,如obj1 = obj2,不会调用拷贝构造,而是调用赋值(operator=)重载函数
  3. 浅拷贝(shallow copy):仅拷贝指针
  4. 深拷贝(deep copy):拷贝指针所指向的内容
  5. 如不自定义类拷贝构造函数,则编译器的默认拷贝构造函数 使用浅拷贝。

类的继承

  1. 基类与派生类是 is A-kind-of 的关系
  2. 类继承分为public、private、protected三种继承。
    public继承中,基类的public、protected成员在派生类中保持原有属性
    private继承中,基类的public、protected成员在派生类中都成为private
    protected继承中,基类的public、protected成员在派生类中都成为protected
    不论何种继承,派生类及其子类均不能访问基类的private成员
  3. 派生类覆盖基类成员函数后,外部调用可通过childClassVar.ParentClassName::Method()访问基类被覆盖函数
  4. 当基类无法给出任何有意义实现时,可以声明纯虚函数,virtual ReturnType f() = 0;,此时该类无法实例化,必须由派生类实现该纯虚函数

类的动态类型转换##

dynamic_cast<Type>
…..

do{}while(0);的妙用(not recommanded)

  1. 消除goto可以用break;代替goto来完成流程控制
  2. 宏定义需要执行多条语句。#define SAFE_DELETE(p) do{ delete p; p = NULL} while(0),既可以把宏展开后的语句块简单当成一条语句,在后面加;也不会造成if等结构体的破坏。 《do…while(0)的妙用》