C++静态成员

我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。

静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员放置在类的定义中,但是可以在类的外部通过使用范围解析运算符:: 来重新声明静态变量从而对它进行初始化,如下面的实例所示。

例子:

<pre name="code" class="cpp">#include<iostream>
using namespace std;

class xc
{
	private:
		double length;
		double width;
	public:
		static int count;
		//构造函数
		xc(double len,double wid)
		{
			cout<<"value"<<endl;
			length=len;
			width=wid;
			//每次创建对象时+1
			count++;
		}
		double area()
		{
			return length*width;
		}
};
//初始化类的静态成员
int xc::count=0;

int main()
{
	xc sw(2.5,3.5);

	cout<<"area="<<sw.area()<<endl;
	cout<<"total objects:"<<xc::count<<endl;

	return 0;
}

 运行结果: 

value

area=7.5

total object:1


静态函数成员

如果把函数成员声明为静态的,就可以把函数与类的任何特定对象独立开来。静态成员函数即使在类对象不存在的情况下也能被调用,静态函数只要使用类名加范围解析运算符 :: 就可以访问。

静态成员函数只能访问静态数据成员,不能访问其他静态成员函数和类外部的其他函数。

静态成员函数有一个类范围,他们不能访问类的 this 指针。您可以使用静态成员函数来判断类的某些对象是否已被创建。

例子:

#include<iostream>
using namespace std;

class xc
{
	private:
		double length;
		double width;
	public:
		static int count;
		//构造函数
		xc(double len,double wid)
		{
			cout<<"value"<<endl;
			length=len;
			width=wid;
			//每次创建对象时+1
			count++;
		}
		double area()
		{
			return length*width;
		}
		//获取count数值
		static int getcon()
		{
			return count;
		}
};
//初始化类的静态成员
int xc::count=0;

int main()
{
	//创建对象之前输出
	cout<<"before:"<<xc::getcon()<<endl;

		xc sw(2.5,3.5);

	//创建对象之后输出
	cout<<"final:"<<xc::getcon()<<endl;

	return 0;
}

输出:

before:0
value
final:1


总结:

出现在类体外的函数定义不能指定关键字static;

静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

非静态成员函数可以任意地访问静态成员函数和静态数据成员;

静态成员函数不能访问非静态成员函数和非静态数据成员;

由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;

调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数;

当同一类的所有对象使用一个量时,对于这个共用的量,可以用静态数据成员变量,这个变量对于同一类的所有的对象都取相同的值。

静态成员变量只能被静态成员函数调用。静态成员函数也是由同一类中的所有对象共用。只能调用静态成员变量和静态成员函数。




类的静态成员在内存只存在一个, 而不管类创建了多少个实例。  

所有成员函数都可以访问静态成员。 

静态成员在类的第一个对象创建之前就已经存在了, public静态成员可以直接通过类名访问。


静态成员变量就相当于一个加了名字空间的全局变量。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Swxctx

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值