对于静态成员:
1)一个类中可以有多个静态函数成员变量,所有的对象都共享这些静态成员变量,都可以引用它。
2)static成员变量和普通static变量一样,都在内存分配区中的全局区分配内存,到程序结束时才释放,这就意味着,static成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。
3)静态成员的初始化只能在类体外;初始化赋值,也可以不赋值,那么会被默认初始化为0.全局数据区的变量都有默认的出事值为0,而动态数据区(堆、栈区)变量的默认值是不确定的,一般认为是垃圾值。
4)静态成员变量既可以通过对象访问,也可以通过类名访问,但要遵循private、protected和public关键字的访问权限限制。当通过对象名访问时,对于不同的对象,访问的是同一份内存。
eg:
①、静态成员不能在类里面赋值
②、非静态函数可以调用静态函数
③、静态函数必须返回静态成员
④、静态函数不能调用非静态函数
⑤、私有静态变量可以通过公有静态函数访问
⑥、私有静态变量可以可以通过友元函数间接访问
⑦、全局静态成员是对象共享的
⑧、函数内的静态成员函数也是对象共享的
#include <iostream>
using namespace std;
class A
{
private:
static int b;
public:
// static int a=10; 静态成员不能在类里面赋值 1
static int a;
int c=1;
void ff()
{
static int d=10;
cout<<"非静态函数,d:"<<d<<endl;
d++;
cout<<"调用静态函数,b:"<<fun()<<endl;//非静态函数可以调用静态函数 2
}
static int fun()
{
// return b+c; 静态函数必须返回静态成员 3
// ff(); 静态函数不能调用非静态函数 4
return b;
}
friend int f(A);
};
int A::a=10;
int A::b=20;
int f(A a)
{
return a.b;
}
int main()
{
A aa;
cout << aa.a << endl;
cout << aa.fun() << endl;//私有静态变量可以通过公有静态函数访问 5
cout<<f(aa)<<endl;//私有静态变量可以可以通过友元函数间接访问 6
A bb;
bb.a++;
cout << aa.a << endl;//输出11 表明全局静态成员是对象共享的 7
aa.ff(); //输出10
bb.ff(); //输出11 表明函数内的静态成员函数也是对象共享的 8
return 0;
}