静态数据成员及静态成员函数

静态数据成员:

作用:实现同类的多个对象之间的数据共享,且又避免了使用全局变量实现数据共享的不安全性。

(1)以关键词static开头.

(2)为各对象所共有,对象分配的空间中不包含静态数据成员所占空间。

(3)静态数据成员在对象外单独开辟空间,其空间不随对象的建立和撤销的影响,静态数据成员在程序编译时被分配空间,到程序结束时才释放空间。

(4)静态数据成员可以初始化,但只能在类体外进行,一般形式:

数据类型类名::静态数据成员名  =  初值  ;(不能初始化表进行初始化)

(5)静态数据成员两种引用方法1、通过对象名引用2、通过类名引用

举例讲解:

class Box
{
public:
	static int i;	
};
int main()
{
	Box box1;
	cout<<Box::i<<endl; 
}

结果提示出错,原因在于静态数据成员被使用前需要在类外进行定义性说明(定义性说明也可同时对其初始化),即增加:  int Box::i;  或者  int Box::i=初值;

class Box
{
public:
	static int i;	
};

int main()
{
	Box box1;
	
	int Box::i;
	
	cout<<Box::i<<endl; 
}

但是增加:   int Box::i;  或者  int Box::i=初值;后结果仍是出错,一番折腾后发现,静态数据成员为独立空间不在对象分配的空间中,它的空间需要在程序一开始就被分配,但函数是程序运行中被调用的,所以静态数据不能在函数中进行定义性说明或初始化。

class Box
{
public:
	static int i;	
};

int Box::i;

int main()
{
	Box box1;	
	cout<<Box::i<<endl; 
	cout<<box1.i<<endl;	
}

至此,程序终于运行成功。

这里还特意示范了两种静态数据成员引用方式

	cout<<Box::i<<endl; 
	cout<<box1.i<<endl;	

运行结果为:     这里说明了未对静态成员赋初值,编译系统默认初值为0

class Box
{
public:
	static int i;
	Box(int a):i(a){}	
};

编译不通过,原因是不能采用参数初始化表对静态数据成员进行初始化

#include<iostream>
using namespace std;
class Box
{
public:
	static int i;
	Box(int a)
	{
		i=a;
	}
};
int Box::i;
int main()
{
	Box box1(10);	
	cout<<Box::i<<endl; 
	cout<<box1.i<<endl;	
}

但这种方法进行初始化成功。

静态成员函数:

主要作用:为了能处理静态数据成员

(1)与非静态成员函数区别在于,静态成员函数没有this指针,决定了不适合访问本类中的非静态成员

但若一定要引用本类中的非静态成员,应当加对象名和成员运算符“.”

(2)静态成员函数也如同静态数据成员一样有两种调用方法1、通过对象名调用2、通过类名调用
举例讲解:
class Box
{
public:
	static int i;
	static int handle()
	{	
		i=10;
		return i;
	}
};
int Box::i;		
int main()
{
	Box box1;
	cout<<Box::handle()<<endl; 
	cout<<box1.handle()<<endl;	
}

编译通过,这里特意示范了两种静态成员函数调用方式

	cout<<Box::handle()<<endl; 
	cout<<box1.handle()<<endl;

这里我们尝试访问用静态成员函数本类中的非静态成员:

class Box
{
public:
	int i;
	static int handle()
	{
		box1.i=10;
		return box1.i;	
	}
};	
int main()
{
	Box box1;
	cout<<Box::handle()<<endl; 
	cout<<box1.handle()<<endl;	
}

编译出错,提示box1没有定义,仔细一想,原因在于box1在main函数中定义的,是局部变量,

它的作用域只限于main函数,所以static int handle()函数中无法使用box1。应该将box1的定义放在函数外。

class Box
{
public:
	int i;
	static int handle();
};	
Box box1;
int Box::handle()
{
	box1.i=10;
	return box1.i;	
}
int main()
{
	cout<<Box::handle()<<endl; 
	cout<<box1.handle()<<endl;	
}
程序运行成功。
特别注意一点,box1的定义放在函数外且要求:要先定义类Box,然后再定义对象Box box1;,定义对象后才能再定义函数static int handle();。所以只能写出如下方式:
class Box
{
public:
	int i;
	static int handle();
};	
Box box1;
int Box::handle()
{
	box1.i=10;
	return box1.i;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值