类和对象(2)

  1. 静态变量有时候也叫class variables

    静态变量在类中被声明,只是创建了一个拷贝而已

    静态数据成员不可以是mutable的

    静态数据成员必须在类外显式地定义,否则不会被构造

    ​ dataType class Name :: memberName = value;

    类内声明需要static,类外定义不需要

    如果静态数据成员是内联的,可以在类内初始化,但这是一次性的

    如果创建了一个对象,静态数据变量可以通过点运算符或指针运算符访问

    如果在静态成员函数中使用非静态变量,会导致编译时错误

    如果要在类内使用静态成员数据,函数必须是静态成员函数

    静态成员函数可以在main函数中,通过类名+作用域解析符直接访问

    即使类的对象没有被创建,可能使用静态成员函数和静态数据

    静态成员函数没有this指针,不能是虚函数,不能被重载,不能被声明为const、volatile或const volatile

    静态成员,既可以用对象名引用,也可以用类名引用

  2. 常数据成员的值必须初始化,而且不能改变,所以只能通过构造函数成员初始化列表的方式实现

    常成员函数中,const在声明和定义时都要出现

  3. 友元函数,不是类的成员函数,但可以访问private变量,但只是单向关系

    派生类的友元函数,可以访问基类的非私有成员,但不能访问私有成员

    基类的友元函数,不能访问派生类的成员

  4. protected继承,父类private的部分对子类是可见的,也是private的

    private继承,父类private的部分对子类是不可见的,“更private的private”

  5. 子类可以赋值给父类,父类不能直接赋值给子类(多的可以给少的)
    所以子类调用父类的拷贝构造的时候,直接传入子类对象,然后把除了父类之外的值单独拿一下
    赋值运算符重载:子类的operator=必须显式调用父类的operator=完成父类的赋值
    base::operator=(s); _age=s._age; ...

  6. 指向基类的指针,可以用派生类的地址初始化
    这是因为,会发生指针从派生类到基类的隐式转换(变的是右值)