类的静态成员变量 & 函数示例
#include <iostream>
using namespace std;
class A{
public:
A(int tmp) : ca(tmp){sa++;}//构造函数可以访问静态成员变量
static void sfunc1(){cout<<sa<<endl;}//静态成员函数可以访问静态成员变量
// static void sfunc2(){cout<<ca<<endl;}//静态成员函数不能直接访问普通成员变量(函数)
static void sfunc3(A& a){cout<<a.ca<<endl;}//静态成员函数间接访问普通成员变量(函数)
void cfunc1(){cout<<sa<<endl;}//普通成员函数可以访问静态成员变量
void cfunc2(){sfunc1();}//普通成员函数访问静态成员函数
void cfunc3(){cout<<ca1<<endl;}//普通成员函数访问普通成员变量
private:
int ca;//普通成员变量
static int sa;//静态成员变量
protected:
int ca1;//普通成员变量
static int sa1;//静态成员变量
};
class B : public A{
public:
B(int tmp) : A(tmp){cout<<sa1<<endl;}//子类构造函数访问父类静态成员变量(函数)
static void sf1(){cout<<sa1<<endl;}//子类静态成员函数函数访问父类静态成员变量(函数)
//static void sf2(){cout<<ca1<<endl;}//子类静态成员函数函数不能访问父类普通成员变量(函数)
void cf1(){cout<<sa1<<endl;}//子类普通函数可以访问父类静态成员变量(函数)
void cf2(){cout<<ca1<<endl;}//子类普通成员函数访问父类普通成员变量(函数)
};
int A::sa = 0;//静态成员变量初始化
int A::sa1 = 0;//静态成员变量初始化,未初始化将报“undefined reference to 'A::sa1'”
int main(){
A::sfunc1();//通过类名(作用域)访问静态成员函数
A a(20);//创建对象a
a.sfunc1();//通过对象名访问静态成员函数
a.cfunc1();//通过对象名访问普通函数
a.cfunc2();//通过对象名访问普通成员函数
A::sfunc3(a);//静态成员函数间接访问普通成员变量
B b(30);//创建对象b
b.cfunc3();
return 0;
}