一、静态成员变量

类的静态成员变量是直接与类联系,属于类的成员而不是对象,供所有对象共享,存放于全局区,因而不计入类的内存计算。

静态成员变量可以通过类直接访问。

(1)静态成员变量的初始化

静态成员不属于类的任何对象,所以并不是对象建立时被定义的,所以它不能由类的构造函数初始化,一般也不能在类内初始化。

关键字static只出现类的内部。

1、在类外定义且初始化

2、常量静态成员可以在类内初始化

一般来说无论怎样静态成员变量都需要在类外进行定义(定义可以初始化赋值,如果不显示初始化就是默认初始化)

(2))静态成员变量的访问

1、使用类作用域运算符直接访问

2、使用类的对象访问

3、成员函数可以直接访问

#include <iostream>
using namespace std;
class A
{
public:
    A(){}
    int val();
    static int stval();
    static int ac;
    const static int bc=2;//常量静态成员可以在类内初始化
private:
    static int dc;
    int nn;
};
int A::ac=1;    //类外定义且初始化
int A::dc=1;
int A::stval()
{
//    nn=10; 静态成员函数不能调用非静态成员
    dc=20;
    return dc;
}
int A::val()
{
    dc=ac;
    return dc;
}
int main()
{
    A a;
    cout<<a.ac;    //使用类的对象访问
    cout<<a.val();
    cout<<A::bc;  //类作用域运算符直接访问
    cout<<A::stval();
    cout<<a.stval();
    return 0;
}

(2)静态成员能使用的某些场景,普通成员不可以的

1、静态成员可以是不完全类型

2、静态成员可以作为默认实参

3、作为类对象的共享成员

class B
{
public:
    B(){}
private:
    int val;
    static B num1;  //静态成员与指针都可以是非完整类型
    B* num2;
//    B num3;  //普通成员变量必须是完整类型
};

class C
{
public:
    C(char c = bkg){}
//    C(int v = yb){} 出错,普通成员变量不能作为默认实参
private:
    char df;
    int yb;
    static int yy;
    static const char bkg='a';
};
int C::yy=1;
int main()
{
    B b;
    C c;
    return 0;
}

二、静态成员函数

1、静态成员函数类似于静态成员变量都属于类而不是对象。

2、静态成员函数仅可以调用类的静态成员变量,不可以调用普通成员变量。

3、不具有this指针,因而自然不能声明为const。

class A
{
public:
    A(){}
    int val();
 //   static int stval ()const; 出错,不具有this指针
private:
    static int bc=2;//常量静态成员可以在类内初始化
};