静态数据成员和静态成员函数(static)
静态数据成员和普通数据成员一样遵从public,protected,private访问规则;一.为什么要使用静态数据成员1.每个对象都有自己都有的数据成员2.不同对象如何共享数据?全局变量:谁都可以访问,不安全静态数据成员:可以实现数据共享,该类的所有对象都共享这块静态存储空间它不属于某一个对象,它与整个程序的生命周期相同,即使某个对象消亡了,静态数据成员还存在,没有改变二.关于静态数据成员的初始
目录
1.与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能够处理静态数据成员
2.静态成员函数只能访问static成员,包括数据成员和成员函数
3.非static成员函数既可以访问static数据成员,也可以访问非static数据成员。static成员函数只能访问satic成员
一、关于静态成员
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;
}
4.静态成员函数不与任何对象绑定在一起,不包含this指针
七、实现一个类,计算程序中创建出了多少个类对象
A的所有对象是构造出来或者拷贝构造出来的
#include<iostream>
using namespace std;
class A
{
public:
A(int a = 1) :_a(a)
{
total++;
use++;
}
A(const A& o)
{
total++;
use++;
}
~A()
{
use--;
}
static int GetT()//静态成员函数没有this指针
{
return total;
}
static int GetU()
{
return use;
}
private:
int _a;
//静态成员为所有类对象所共享
static int total;//计算累计使用的对象
static int use;//正在使用的对象
};
int A::total = 0;//计算累计使用的对象
int A::use = 0;//正在使用的对象
A Function(A x)
{
A fun;
return fun;
}
int main()
{
A a_1;
A a_2;
A a_3;
cout << "total: " << A::GetT() << " use: " << A::GetU() << endl;
Function(a_3);
cout << "total: " << A::GetT() << " use: " << A::GetU() << endl;
return 0;
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)