1.类与对象基本概念

/*
        类:对一系列事物的的共同属性或者行为的一种抽象
            用class修饰的(结构体在C++中也可以当作类)
        属性:事物的特征    -->数据成员
        行为:具体的操作    -->成员函数

        对象:类的具体化
*/
//1.定义一个类
namespace myData {    //用namespace包括,避免重名问题
    class MM {
    public:
        //属性
        string name;
        int age;
        //行为
        void print()
        {
            cout << name << age << endl;
        }
    };
}

int main()
{
    myData::MM mm = { "小可爱",12 };

    return 0;
}

2.权限问题

//2.类的权限问题
namespace myData1 {    //用namespace包括,避免重名问题
    //类外对象只能访问公有属性,对于类中函数没有权限可言
    class MM {
        int num;//默认为私有属性
    public://公有属性
        //行为
        void init(string name,int age,int num,int money)
        {
            this->name = name;
            this->age = age;
            this->num = num;
            this->money = money;
        }
        int& getAge()
        {
            return age;
        }
        //慎用,该用法破坏了MM的封装性(num是私有属性,但返回引用使得在类外可以修改其)
        int& getNum()
        {
            return num;
        }

        void print()
        {
            cout << name <<"\t"<< age<<"\t" << num <<"\t" << money << endl;
        }
    protected://保护属性
        //属性
        string name;
        int age;
    private://私有属性
        int money;
    };
    //对结构体而言,也存在权限限定,但结构体中默认为公有属性
}

3.类中一些东西的表示

//3.类的一些东西表示
namespace myData2 {    //用namespace包括,避免重名问题
    class MM {
    public:
        //行为
        void print();
    protected:    //数据成员一般写为保护权限,很少写private
        //属性
        string name="小可爱";
        int age=18;
    };
}
void myData2::MM::print()
{
    cout << name <<"\t"<< age << endl;
}

int main()
{
    myData::MM mm = { "小可爱",12 };

    myData1::MM mm3;
    mm3.init("小可爱", 18, 100, 520);
    mm3.getNum() = 10;
    mm3.print();

    myData2::MM mm1;
    mm1.print();
    //成员函数的指针
    //auto pf = myData1::MM::print;
    //*函数指针代表整个函数名
    //MM:: 修饰*函数指针
    //void(*myData1::MM::p)() = &myData1::MM::print;    错误
    void(myData2::MM:: * p)() = &myData2::MM::print;
    //(类的对象.*指针)(参数)
    (mm1.*p)();
    //mm1.(*p)();    错误
    myData2::MM* mm2 = new myData2::MM;
    (mm2->*p)();

    return 0;
}