C++类的静态成员变量和静态成员函数

1.静态成员变量

1)普通成员变量
 通过对象名能够访问public成员变量
 每个对象的普通成员变量都是专属的,不能在对象之间共享

2)静态成员变量
 静态成员变量属于整个类所有,所有对象共享类的静态成员变量
 静态成员变量的生命周期不依赖于任何对象
 可以通过类名和对象名访问public静态成员变量

3)静态成员变量的定义
 静态成员变量只能在类的内部定义,声明时直接通过static关键字修饰
 静态成员变量在类的外部定义与初始化,语法规则为Type ClassName::VarName = value;
 静态成员变量不占用类的大小,而是在类外(全局数据区)单独分配空间

#include <stdio.h>
class Test
{
private:
    static int c;
};

int Test::c = 0;      //必须初始化,否则使用的时候编译器会报错。因为这里不仅仅是初始化,主要是分配内存。

注意:
 基类定义的静态成员, 将被所有的派生类共享。
 静态数据成员在程序中只有一份拷贝, 由该类型的所有对象共享访问。
 静态数据成员和普通数据成员一样遵从访问控制原则。

2. 静态成员函数

 静态成员函数属于整个类所有
 可以通过类名和对象名访问public静态成员函数

注意:
 出现在类体外的函数定义不能指定关键字static 。
 静态成员函数只能访问静态数据成员(变量)和静态成员函数。
 静态成员函数也遵从访问控制原则。

`

3.例子

#include<iostream>

using namespace std;

class Base
{
public:
    //定义一个静态成员
    static int i;
    void print()
    {
        cout << "i: " << i << endl;
    }
    //静态成员函数只能在类的内部定义
    //静态成员函数,只能使用静态成员函数和静态数据成员
    static void Add1()
    {
        i++;
    }
};
//对静态成员显式地进行初始化,让编译器分配内存空间
int Base::i = 0;

class Derived : public Base
{
public:
    void print()
    {
        cout << "i: " << i << endl;
    }
    static void Add2()
    {
        i += 2;
    }
};

int main()
{
    //在使用时,所有的基类和派生类对象使用的是同一个静态成员
    Base b1;
    b1.i = 2;
    b1.print();

    Derived d1;
    d1.print();
    d1.i = 5;
    d1.print();
    b1.print();

    b1.Add1();
    b1.print();

    d1.Add2();
    b1.print();
    d1.print();
    return 0;
}


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页