天天看点

C++第03课 特殊成员 (二)

1.static成员

static成员特性: 它的调用可以不需要对象,它整个类共有的,(所有对象用的都是同一个),不是某一个对象单独属性。static 的成员虽然不需要对象就可以调用,但是依然是类的权限限定的

+ static数据成员

+ static 修饰的数据成员,就是静态数据成员

+ 不能在类中初始化,必须在类外初始化,在类外初始化的时候不再需要static修饰,但是需要类名限定

class MM {
public:
    //const成员必须采用初始化参数列表
    MM(string name, int age, int id) :name(name), age(age), id(id) { this->money++; }
    MM(const MM& obj):name(obj.name),age(obj.age) { cout << "拷贝构造" << endl; };
    int getMoney()
    {
        return money;
    }

    void print()
    {
        cout <<"normal\t"<< name << "\t" << age << "\t" << id <<"\t"<<money << endl;
    }
    //常成员函数,允许属性不同的同名函数存在,不允许修改数据成员
    void print() const
    {
        //age = 20;    错误
        cout <<"const\t"<< name << "\t" << age << "\t" << id <<"\t" << money <<endl;
    }
    void doSomething()
    {

    }
protected:
    //常数据成员
    const string name;
    const int age;
    //普通数据
    int id;
    //静态数据成员,不能在类中初始化
    static int money;
};
int MM::money = 100;

int main()
{
    MM mm("小可爱", 18, 1001);
    //普通对象优先调用普通函数
    mm.print();    //normal

    //常对象只能调用常成员函数,不能调用普通函数
    const MM mm1("小宝贝", 2, 1002);
    mm1.print();    //const
    
    MM mm2 = mm1;    //赋值不会复制const属性,调用拷贝构造
    mm2.print();

    return 0;
}