关键字static的作用

本文主要介绍了C语言和C++中static关键字的作用。在C语言里,static可让函数体内变量值不变、限制模块内变量和函数的访问范围。在C++中,它能修饰局部变量、全局变量、函数、成员变量和成员函数,还具有隐藏特性,且不能与const同时修饰成员函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、 关键字static的作用是什么?

正确答案:
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数 据和代码范围的好处和重要性。

 

2.static关键字的作用

 

  •   修饰局部变量

    static修饰局部变量时,使得被修饰的变量成为静态变量,存储在静态区。存储在静态区的数据生命周期与程序相同,在main函数之前初始化,在程序退出时销毁。(无论是局部静态还是全局静态)

 

  •   修饰全局变量

    全局变量本来就存储在静态区,因此static并不能改变其存储位置。但是,static限制了其链接属性。被static修饰的全局变量只能被该包含该定义的文件访问(即改变了作用域)。

 

  •   修饰函数

     static修饰函数使得函数只能在包含该函数定义的文件中被调用。对于静态函数,声明和定义需要放在同一个文件夹中。

  •   修饰成员变量

      用static修饰类的数据成员使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象,所有的对象都只维持同一个实例。 因此,static成员必须在类外进行初始化(初始化格式:int base::var=10;),而不能在构造函数内进行初始化,不过也可以用const修饰static数据成员在类内初始化。

  •   修饰成员函数

     用static修饰成员函数,使这个类只存在这一份函数,所有对象共享该函数,不含this指针,因而只能访问类的static成员变量。静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。例如可以封装某些算法,比如数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所以从类上调用感觉更好,比如定义一个数学函数类Math,调用Math::sin(3.14);还可以实现某些特殊的设计模式:如Singleton;

最重要的特性:隐藏

    当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。

不可以同时用const和static修饰成员函数。

   C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。

例1:修饰成员变量:同一个类的所有实例共享一个静态成员变量

#include<iostream>

using namespace std;
class S1
{
public:
	static int a;
	void say(){
		cout << a << endl;
	}
protected:
private:
};
int S1::a = 10;
void main(){
	S1 s1;
	S1 s2;
	s1.a = 5;
	s1.say();//5
	s2.say();//5
	s2.a = 6;
	s1.say();//6
	
	system("pause");
 
}

 

在Java编程语言中,`static`关键字是一个非常重要的修饰符,它可以用来修饰变量、方法、代码块和嵌套类。`static`关键字作用主要有以下几个方面: 1. **静态变量**: - 静态变量属于类,而不是某个特定的实例对象。所有的实例对象共享同一个静态变量。 - 静态变量在类加载时初始化,且只初始化一次。 2. **静态方法**: - 静态方法属于类,而不是某个特定的实例对象。静态方法可以通过类名直接调用,而不需要创建类的实例。 - 静态代码块用于初始化静态变量。它在类加载时执行,并且只执行一次。 - 静态代码块通常用于复杂初始化操作。 4. **静态嵌套类**: - 静态嵌套类是指被声明为`static`的内部类。静态嵌套类可以不依赖于外部类的实例对象而存在。 - 静态嵌套类可以访问外部类的静态成员,但不能直接访问外部类的实例成员。 示例代码: ```java public class MyClass { // 静态变量 static int staticVar = 10; // 实例变量 int instanceVar = 20; // 静态方法 static void staticMethod() { System.out.println("This is a static method."); System.out.println("Static variable: " + staticVar); // System.out.println("Instance variable: " + instanceVar); // 编译错误 } // 实例方法 void instanceMethod() { System.out.println("This is an instance method."); System.out.println("Static variable: " + staticVar); System.out.println("Instance variable: " + instanceVar); } // 静态代码块 static { System.out.println("Static block executed."); } // 静态嵌套类 static class StaticNestedClass { void display() { System.out.println("Static nested class."); System.out.println("Static variable: " + staticVar); // System.out.println("Instance variable: " + instanceVar); // 编译错误 } } public static void main(String[] args) { // 调用静态方法 staticMethod(); // 创建实例对象 MyClass myObject = new MyClass(); myObject.instanceMethod(); // 调用静态嵌套类的成员 StaticNestedClass nestedObject = new StaticNestedClass(); nestedObject.display(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值