静态数据成员和静态成员函数(static)

目录

一、关于静态成员 

二、静态数据成员和普通数据成员的共同点 

三、为什么要使用静态数据成员

四、关于静态数据成员的初始化

五、静态成员的访问方式 

六、静态成员函数

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;
} 

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;
}


 

  • 46
    点赞
  • 205
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值