目录
一.关于静态成员
二.静态数据成员和普通数据成员的共同点
三.为什么要使用静态数据成员
四.关于静态数据成员的初始化
五. 静态成员的访问方式
六.静态成员函数
1.与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能够处理静态数据成员
2.静态成员函数只能访问static成员,包括数据成员和成员函数
3.非static成员函数既可以访问static数据成员,也可以访问非static数据成员。static成员函数只能访问satic成员
4.静态成员函数不与任何对象绑定在一起,不包含this指针
一.关于静态成员
1.静态成员的声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>,非静态成员则不能。
2. static成员变量属于类(被存放在数据段中),不属于某个具体的对象(具体对象的内存是分配在堆中的),即使创建多个对象,也只为该变量分配一次内存,所有对象使用的都是这份内存中的数据。
3.若它为public类型,当某个对象修改了它,也会影响到其他对象,所有对象都是“同甘共苦的”
二.静态数据成员和普通数据成员的共同点
静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
三.为什么要使用静态数据成员
1.每个对象都有自己都有的数据成员
2.不同对象如何共享数据?
全局变量:谁都可以访问,不安全
静态数据成员:可以实现数据共享,该类的所有对象都共享这块静态存储空间它不属于某一个对象,它与整个程序的生命周期相同,即使某个对象消亡了,静态数据成员还存在,没有改变
四.关于静态数据成员的初始化
在类内定义,类外声明
声明的格式 <数据类型><类名>::静态数据成员 = <值>
静态数据成员不能直接初始化
例如,错误的
static int i=5;
//正确代码举例#include<iostream>using namespace std;class A{public:static int i;};int A::i=5;//::表示i是属于A这个类的 int main(){A a;cout<<A::i<<endl;//通过类名加域作用符直接访问 cout<<a.i<<endl;//通过对象访问 return 0; }
#include <iostream>using namespace std;class A{public: static int i;};int A::i=9; int main(){A a,b;cout<<a.i<<endl;cout<<b.i<<endl;cout<<"----------"<<endl;b.i=8;cout<<a.i<<endl;//通过这两行的输出表明a,b两个对象共享内存空间 cout<<b.i<<endl;return 0;}
五. 静态成员的访问方式
1.通过作用域运算符::直接访问静态成员 类名::静态成员
2.通过对象.静态成员
3.通过指针->静态成员
//访问静态数据成员#include<iostream>using namespace std;class A{public:static int i;};int A::i=5;//::表示i是属于A这个类的 int main(){A a;cout<<A::i<<endl;//通过类名加域作用符直接访问 cout<<a.i<<endl;//通过对象访问 A * a1=&a;cout<<a1->i; //通过对象指针访问数据成员 return 0; }
//访问静态成员函数 #include <iostream>using namespace std;class Box{public:static int c;int a,b;Box(int x,int y){a=x;b=y;}static void fun(){cout<<c<<endl;cout<<"static fun----"<<endl;}};int Box::c=8;int main(){Box box(2,3);Box::fun();//使用作用域运算符直接访问静态成员 box.fun();//通过对象.引用名 Box * box2=&box; box2->fun(); //通过类Box对象的指针 return 0;}
六.静态成员函数
1.与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能够处理静态数据成员
#include<iostream>using namespace std;class Box{public:static void fun(){cout<<"static---"<<endl;}};int main(){Box box1;box1.fun();Box::fun();return 0; }
2.静态成员函数只能访问static成员,包括数据成员和成员函数
#include <iostream>using namespace std;class Box{public:static int c;int a,b;Box(int x,int y){a=x;b=y;}static void fun(){cout<<c<<endl;cout<<"static fun----"<<endl;}};int Box::c=8;int main(){Box box(2,3);box.fun();Box::fun();return 0;}
错误举例:
class Box{public:static int c;int a,b;Box(int x,int y){a=x;b=y;}static void fun(){cout<<a<<endl;cout<<"static fun----"<<endl;}};
3.非static成员函数既可以访问static数据成员,也可以访问非static数据成员。static成员函数只能访问satic成员
#include <iostream>using namespace std;class Box{public:static int c;int a,b;Box(int x,int y){a=x;b=y;}void fun(){cout<<a<<" "<<c<<endl;cout<<"static fun----"<<endl;}};int Box::c=8;int main(){Box box(2,3); box.fun();//通过对象.引用名 return 0;}