static关键字的用法

分别讨论:

在C语言中:

从两方面讲:

1、static修饰变量时

①修饰的变量为局部变量时==》静态局部变量

a)生存周期延长,始终驻留在全局数据区,直到程序运行结束。

b)不会改变作用域,作用域为局部作用域

②修饰的变量为全局变量时==》全局静态变量

限制该变量的作用域为文件作用域,该变量在本文件内从定义开始到文件结束可见。不能被其他文件使用。

2、static修饰函数时 ==>静态函数

static加在函数定义或者申明前,限制函数作用域到文件作用域

在C++中

新增了两种作用,修饰静态成员方法静态成员变量。静态成员变量和静态成员方法统称为静态成员。

静态成员的特点:

①内存分配:在程序的全局数据区分配。

②初始化和定义:静态成员定义时要分配空间,所以不能在类申明中定义。

③静态成员函数和静态数据成员都没有this指针。

下面通过几个例子来加深一下印象:

1、sizeof不将静态成员变量的大小计算在内

class A
{
public:
	A(int data):mb(data){}
	~A(){}
private:	
	int mb;
	static int ma;//静态成员变量的申明
};
//如果不进行初始化,会出现链接错误:error LNK2001: 无法解析的外部符号 "private: static int A::ma" (?ma@A@@0HA)
int A::ma;//静态成员变量在使用之前必须进行初始化,否则链接时会出现错误。


2、通过类名访问静态成员

因为静态成员属于整个类,不属于某一个对象。所以即使没有任何一个实例,类静态成员也已经存在了。在类实例化之前就已经分配空间了,所以对象可以访问静态成员,类名也可以访问。相对的,而类的非静态成员在类实例化之后才有内存空间,所以静因此静态成员函数在访问非静态成员函数时会出错!!!

class A
{
public:
	A(int data):mb(data){}
	~A(){}
	static void show()//静态成员函数     在此函数中访问变量mb会出错!!!
	{
		cout<<"static void show()"<<endl;
	}
public:
	//静态成员依旧收到public,private,protected的限制
	static int ma;//为了通过类名来访问成员变量,需要public权限
private:	
	int mb;
};
int A::ma=20;//使用之前必须进行初始化
int main()
{
	cout<<A::ma<<endl;//即使时没有实例化对象,但是通过类名也能访问静态成员	
	cout<<a.ma<<endl;//通过对象来进行访问变量
	A::show();//通过类名来访问静态成员方法
	a.show();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值