static类成员、static类函数

1.static类成员

  1.静态数据成员是一种特殊的数据成员,以关键字static修饰。
  2.静态的数据成员在内存中只占一份空间,保存在全局区(静态区),即静态数据成员属于类而不属于对象,为所有实例(对象)共享,当某一个实例(对象)修改了该静态成员变量,其修改值为所有实例(对象)可见。
  3.静态的数据成员不占用对象的空间,保存在全局区,所以声明多个对象时,静态的数据成员依然只在全局区保留了一份,不再像其他的数据成员一样占用对象的空间。
  4.static成员变量必须在类外面定义,类内仅是声明,且声明必须加static,定义不用加
  5.只有在定义对象时,才为对象的数据成员分配空间,但是只要在类中指定了静态数据成员,即使不定义对象,也会为该静态数据成员分配空间。
  6.静态数据成员在程序开始时被分配空间,到程序结束时释放,即生命周期是整个工程。 

class Date
{
    static int count;//静态成员变量
private:
    int _year;
    int _month;
    int _day;
public:
    Date()
    {
        cout << "Date()" << endl;
        ++count;
    }
    void Show()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
};
int Date::count=0;//在类外定义,因为静态成员属于类,所以不用调用对象,直接调用类

static类成员、static类函数_第1张图片

2.static成员函数

  作用:主要用来访问静态数据成员
  1.是类的一部分,而不是对象的一部分,和静态数据成员一样。所以静态函数无this指针。
  2.无this指针,所以静态成员函数不能访问非static成员变量,只能访问static成员变量
  3.公用的成员函数可以引用对象的非静态数据成员,也可以访问类中的静态数据成员
  

class Date
{
private:
    int _year;
    int _month;
    int _day;
public:
    Date()
    {
        cout << "Date()" << endl;
        ++count;
    }
    void Show()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
    static void PrintCount()//静态成员函数(无this指针,不属于对象,可以通过类直接调用)所以static不能调用非static成员
    {
        cout << "PrintCount: " << count << endl;
        //cout << _year << endl; //试图访问非static数据成员,error
    }
    static int count;//静态成员变量
};

int Date::count = 0;

void Test()
{
    Date d1, d2;
    Date::PrintCount();
}

你可能感兴趣的:(C++学习笔记)