C++面向对象:类
类的定义
类的构造函数和析构函数
类的拷贝控制
友元
见友元
类的核心特性之封装
类的核心特性之继承
类的核心特性之多态
this指针
编译器会给每个非静态的成员函数增加了一个隐藏的常量指针:T * const this。
this指针指向当前对象,并且不能改变this指针的指向。
this指针本质上是非静态成员函数一个的形参:是对象调用成员函数时,将对象地址作为实参传递给函数,所以对象中不存储this指针。
this指针本身并不作为对象的一部分存储在对象的内存布局中。它是在函数被调用时,通过参数传递机制在栈上创建的。
const成员函数实际上限制的是this,将T * const this限定成T const * const this。
类成员函数的内联
只要在类声明的内部定义并实现了成员函数,编译器就会自动将其视为内联函数。
如果在类定义外部实现成员函数,同时希望它是内联的,那么必须在函数定义时使用inline关键字。
class Foo {
public:
    void bar(); // 声明不需要加inline关键字
};
// 在类外定义时才加inline关键字
inline void Foo::bar() {}
类的静态成员
类的静态成员不属于类的任何一个具体对象,而是属于整个类本身。所有该类的对象都共享同一个静态成员。
静态成员函数不与任何特定对象绑定,因此没有this指针
其他用法见C++关键字-static
类的嵌套
在一个类的内部声明另一个类,我们称外面的类为封闭类,Enclosing Clas;内部的类为嵌套类,Nested Class。
嵌套类必须在类的内部声明,但是可以定义在类的内部或者外部。
类中声明并定义
class Outer {
public:
    class Inner {
    public:
        void InnerFunc() {}
    };
    void OuterFunc() {}
};
类中声明,类外定义
class Outer {
public:
    class Inner;
    void OuterFunc() {}
};
class Outer::Inner {
public:
    void InnerFunc();
};
void Outer::Inner::InnerFunc() {}
作用域:
- 在封闭类内部,可以直接使用嵌套类的名字来创建对象。
- 在封闭类外部,你需要使用作用域解析符::来引用嵌套类。
嵌套类对封闭类成员的访问
- 嵌套类不能直接访问封闭类的非静态成员。因为嵌套类没有封闭类对象的this指针。
- 嵌套类可以访问封闭类的静态成员。
封闭类对嵌套类成员的访问:遵循封闭类成员的访问修饰符。
类外部对嵌套类成员的访问:遵循封闭类的访问修饰符。
class Outer {
public:
    class Inner {
    public:
        int a;
        static int b;
    private:
        int c;
        static int d;
        void InnerFunc() {
            a = 1;
            b = 1;
            Outer::a = 1; // 编译报错
            Outer::b = 2; // ok
            Outer::c = 3; // 编译报错
            Outer::d = 4; // ok
        }
    };
    int a;
    static int b;
    void OuterFunc() {
        Inner i;
        i.a = 1;
        i.b = 2;
        i.c = 3; // 编译报错
        i.d = 4; // 编译报错
    }
private:
    int c;
    static int d;
};