Tip1: 可以用多种方式创建对象,指针对象一定要及时释放
    在栈上创建对象可以写作Student stu()Student stu
    在堆上创建对象可以写作Student *pstu = new Student()Student *pstu = new Student,它们都会调用构造函数 Student()。
    指针一旦创建,一定要养成习惯及时Delete掉。

    Tip2: const 属性只能使用初始化列表的方式赋值
    class VLA{
    private:
    const int m_len;
    int m_arr;
    *public
    :
    VLA(int len);
    };

    //必须使用初始化列表来初始化 m_len
    VLA::VLA(int len): m_len(len){
    m_arr = new int[len];
    }

    Tip3:const加在方法名的前面和后面有讲究
    需要强调的是,必须在成员函数的声明和定义处同时加上 const 关键字。char *getname() constchar *getname()是两个不同的函数原型,如果只在一个地方加 const 会导致声明和定义处的函数原型冲突。

    最后再来区分一下 const 的位置:

    • 函数开头的 const 用来修饰函数的返回值,表示返回值是 const 类型,也就是不能被修改,例如const char * getname()
    • 函数头部的结尾加上 const 表示常成员函数,这种函数只能读取成员变量的值,而不能修改成员变量的值,例如char * getname() const

    Tip4:友元函数全局非成员函数,通过对象指针访问内部成员。
    关于友元,有两点需要说明:

    • 友元的关系是单向的而不是双向的。如果声明了类 B 是类 A 的友元类,不等于类 A 是类 B 的友元类,类 A 中的成员函数不能访问类 B 中的 private 成员。
    • 友元的关系不能传递。如果类 B 是类 A 的友元类,类 C 是类 B 的友元类,不等于类 C 是类 A 的友元类。

    除非有必要,一般不建议把整个类声明为友元类,而只将某些成员函数声明为友元函数,这样更安全一些。

    Tip5:派生类的三种继承方式
    语法:
    class Student: public/protected/private People

    不同的继承方式会影响基类成员在派生类中的访问权限。

    1) public继承方式

    • 基类中所有 public 成员在派生类中为 public 属性;
    • 基类中所有 protected 成员在派生类中为 protected 属性;
    • 基类中所有 private 成员在派生类中不能使用。

    2) protected继承方式

    • 基类中的所有 public 成员在派生类中为 protected 属性;
    • 基类中的所有 protected 成员在派生类中为 protected 属性;
    • 基类中的所有 private 成员在派生类中不能使用。

    3) private继承方式

    • 基类中的所有 public 成员在派生类中均为 private 属性;
    • 基类中的所有 protected 成员在派生类中均为 private 属性;
    • 基类中的所有 private 成员在派生类中不能使用。