static(静态)变量有什么作用?

static(静态)变量有什么作用?

在C语言中,关键字static的意思是静态,它有3个明显的作用:

1)在函数体内,静态变量具有“记忆”功能,即一个被声明为静态的变量在这一函数被调用的过程中其值维持不变。

2)在模块内(但在函数体外),它的作用域范围是有限制的,即如果一个变量被声明为静态的,那么该变量可以被模块内所有的函数访问,但不能被模块外其他函数访问。它是一个本地的全局变量,如果一个函数被声明为静态的,那么该函数与普通函数作用域不同,其作用域仅在本文件中,它只可能被这一模块内的其他函数调用,不能被模块外的其他函数调用,也就是说这个函数被限制在声明它的模块的本地范围内使用。

3)内部函数应该在当前源文件中说明和定义,对于可在当前源文件以外使用的函数,应该在一个头文件中说明,使用这些函数的源文件要包含这个头文件。

具体而言,static全局变量和普通的全局变量的区别在于static全局变量只初始化一次,这样做的目的是为了防止在其他文件单元中引用。static局部变量和普通局部变量的区别在于static局部变量只被初始化一次,下一次的计算依据是上一次的结果值。static()函数和普通函数的区别在于作用域不一样,static()函数只在一个源文件中有效,不能被其他源文件使用。

C++中,在类内数据成员的声明前加上关键字static,该数据成员被当做是类的成员。静态数据成员有以下特点:

1)对于非静态成员,每个类对象都有自己的复制品。而静态数据成员被当做是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份复制品,由该类型的所有对象的共享访问。

2)静态数据成员存储在全局数据区。定义时要分配空间,所以不能在类声明中定义。由于静态数据成员属于本类的所有对象共享,所以它不属于特定的类对象,在没有产生类对象时,其作用域就可见,即在没有产生类的实例的时,程序员也可以使用它。

3)静态数据成员和普通数据成员一样遵从public,protected,private访问规则。

4)static成员变量的初始化在类外,此时不能带上static关键字。private、protected的static成员虽然可以在类外初始化,但是不能在类外被访问。

与全局变量相比,使用静态数据成员有以下两个优势:

1)静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。

2)可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能。

需要注意的是,类的静态成员必须初始化,因为它是在程序初始化的时候分配的。类中只是声明,在cpp中才是初始化,可以在初始化的代码上放个断点,在程序执行main()的第一条语句之前就会先走到那儿。如果静态成员是个类,那么就会调用它的构造函数。

静态成员函数不具备this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态数据成员,只能调用其余静态成员函数。

引申1:为什么static变量只初始化一次?

对于所有对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直没有销毁,而是保存在内存区域中,所以不会再次初始化。

存放在静态区的变量的生命周期一般比较长,一般与整个源程序“同生死,共存亡”,所以它只需初始化一次。而auto变量,即自动变量,由于存放在栈区,一旦调用过程结束,就会立刻被销毁。

引申2:在头文件中定义静态变量,是否可行?为什么?

不可行,如果头文件中定义静态变量,会造成资源浪费的问题,同时也可能引起程序错误。因为如果在使用该头文件的每个C语言文件中定义静态变量,按照编译的步骤,在每个头文件中都会单独存在一个静态变量,从而会引起空间或者程序错误。

所以不推荐在头文件中定义任何变量,当然也包括静态变量。

静态变量Static Variables)和实例变量(Instance Variables)是面向对象编程中关于内存分配和生命周期的概念,它们的区别主要体现在以下几个方面: 1. **内存分配**: - 实例变量:每个对象都有自己的副本,当创建对象时自动分配内存空间,称为对象的成员变量。 - 静态变量:只有一份,属于整个类而不是特定的对象,所有对象共享同一块内存。 2. **生命周期**: - 实例变量:随着对象的创建而存在,对象消失时,实例变量也随之销毁。 - 静态变量:存在于类的整个生命周期内,直到程序结束才释放。 3. **访问权限**: - 实例变量:如果没有特别说明,默认在一个类的范围内有效,通过对象的引用进行访问。 - 静态变量:可以直接通过类名来访问,无需创建对象即可使用,也可以通过类的对象访问。 4. **初始化**: - 实例变量:通常在构造函数中初始化,每个对象有自己的初始化值。 - 静态变量:一般在类加载时就初始化,所有对象共享同样的初始值。 5. **多线程情况**: - 实例变量:对于多线程环境,每个对象的实例变量有自己的独立副本,互不影响。 - 静态变量:全局共享,可能会导致线程安全问题,需额外关注并发控制。 总之,实例变量是为了满足对象状态的个性化需求,而静态变量则是为了节省内存并提供类级的常量或共享资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值