C++静态成员静态函数,语法+示例,超详细!!

类的静态成员定义

静态成员是指用static定义的变量 就是成员变量前面加了个 static

静态变量分为全局变量和局部变量两种

静态全局变量

静态全局变量声明在程序所有函数之外,其作用域与全局变量一样,所有函数体都可以使用,但是静态全局变量只能严格限定在定义它的文件中,不能被其他文件使用(其他文件即使用extern声明过也不能使用)

拓展:extern:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

比如:在.h文件中我们只是定义,真正的函数内容我们是在.c文件中写的,extern声明也是一样,我们在.h文件中声明一个 extern int i;在相应.c文件中写 int i;这样这个变量 i 就能被其他函数调用了。

静态局部变量

静态局部变量声明在某个函数体中,其他函数不能使用。

静态局部变量的特殊之处在于,函数被调用N次,初始化语句只会执行一次,之后则会取在内存静态区中储存的上次函数调用结束时该静态变量的值,而不是初始化语句。

//特殊之处的举例说明


#include<iostream>
using namespace std;
void Static()
{
	static int n = 1;
	n *= 2;
	cout<<"静态变量:"<<n<<endl; 
}
void Auto()
{
	int n = 1;
	n *= 2;
	cout<<"普通变量:"<<n<<endl;
}
int main()
{
	Static();
	Static();
	Static();
	Static();
	Auto();
	Auto();
	Auto();
	Auto();
	return 0;
}

9

因静态局部变量的特殊之处,我们可以记录函数的调用次数

类的静态成员

会一直存在于程序的整个生命周期中,不会像普通变量一样随着对象的存在而存在,消亡而消亡

静态成员变量的声明

静态成员变量的声明方法:

static 数据类型 成员变量名;

静态成员变量属于类,该类的所有对象共享静态成员变量

#include<iostream>
using namespace std;
class Data
{
	public:
		int n;
		static int m;	//静态成员变量 类内声明
};
int Data::m=0;		//类外初始化
int main()
{
	Data d1,d2;
	return 0;
}

//d1.n 与 d2.n 是两个不同的变量

//d1.m 与 d2.m 是同一个变量

静态成员变量的初始化

类的static变量必须在类内声明,类外初始化

静态成员变量的初始化语句为:

数据类型 类名::静态成员变量 = 初始值;


#include<iostream>
using namespace std;
class Data
{
	public:
		int n;
		static int m;	//静态成员变量 类内声明
};

int Data::m=0;					//类外初始化

int main()
{
	Data d1,d2;
	return 0;
}

静态成员函数

静态成员函数的声明

声明方法:

static 返回值类型函数名(参数表)

//在书写静态成员函数的代码时,不必写static
#include<iostream>
using namespace std;
class Student
{
	int id;
	float score;
	static float sum;	//总分 
	static int count;	//计数
	 
	public:
		Student(int i,int s):id(i),score(s)		//定义构造函数
		{
			count++;
		} 
		void total();				//总分	
		
		static float average(); //平均数 			//静态成员函数的声明
};
		
float Student::sum = 0;		//静态成员变量的初始化
int Student::count = 0; 

void Student::total()
{
	sum += score;
}

float Student::average()		//静态成员函数
{
	if(count)
		return sum/count;
}

int main()
{
	Student stu[3] = {Student(1,10) , Student(2,20) , Student(3,30)};
	for(int i=0;i<3;i++)
		stu[i].total();
	cout<<"平均分是:"<<Student::average();		//不需要用对象,因为这是共有的
	return 0;
}

说明:静态成员函数可以直接引用私有的静态数据成员(不需要加类名或者对象名)

建议:只用静态成员函数引用静态数据成员,而不引用非静态数据成员。这会使思路清晰,不易出错

对比

静态成员函数普通成员函数
所有对象共享
this指针×
访问普通成员 变量/函数×
访问静态成员 变量/函数
通过类名调用×
通过对象名调用
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值