static变量大致分为三种用法
1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.
2. 用于全局变量,主要作用是限制此全局变量被其他的文件调用.
3. 用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象
1. 静态局部变量
静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(2)允许对构造类静态局部量赋初值 例如数组,若未赋以初值,则由系统自动赋以0值。
(3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
举例如下:
int fun() {
static int a = 1;
a++;
}
在第一次进入这个函数的时候,变量a被初始化为1!并接着自增1,以后每次进入该函数,a就不会被再次初始化了,仅进行自增1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:
int a = 1;
int fun() {
a++;
}
2.静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。
只在cpp内有效的全局变量:
在cpp文件的全局范围内声明:
static int g_value = 0;
这个变量的含义是在该cpp内有效,但是其他的cpp文件不能访问这个变量;如果有两个cpp文件声明了同名的全局静态变量,那么他们实际上是独立的两个变量;
如果不使用static声明全局变量:
int g_value = 0;
那么将无法保证这个变量不被别的cpp共享,也无法保证一定能被别的cpp共享,因为要让多个cpp共享一个全局变量,应将它声明为extern(外部)的;也有可能编译会报告变量被重复定义;总之不建议这样的写法,不明确这个全局变量的用法;
如果在一个头文件中声明:
static int g_vaule = 0;
那么会为每个包含该头文件的cpp都创建一个全局变量,但他们都是独立的;所以也不建议这样的写法,一样不明确需要怎样使用这个变量,因为只是创建了一组同名而不同作用域的变量;
这里顺便说一下如何声明所有cpp可共享的全局变量,在头文件里声明为extern的:
extern int g_value; // 注意,不要初始化值!
然后在其中任何一个包含该头文件的cpp中初始化(一次)就好:
int g_value = 0; // 初始化一样不要extern修饰,因为extern也是声明性关键字;
然后所有包含该头文件的cpp文件都可以用g_value这个名字访问相同的一个变量;
3.static的类成员变量static关键字有两种意思,你看上下文来判断
a,表示变量是静态存储变量,表示变量存放在静态存储区.
b,表示该变量是内部连接(这种情况是指该变量不在任何{}之内,就象全局变量那样,这时候加上static),也就是说在其它的.cpp文件中,该变量是不可见的(你不能用).
二、static 函数
1.类的静态函数:
class A
{
private:
static void func(int value);
};
实现的时候也不需要static的修饰,因为static是声明性关键字;
类的静态函数是在该类的范畴内的全局函数,不能访问类的私有成员,只能访问类的静态成员,不需要类的实例即可调用;实际上,它就是增加了类的访问权限的全局函数:void A::func(int);
静态成员函数可以继承和覆盖,但无法是虚函数;
2.只在cpp内有效的全局函数:
在cpp内声明:
static void func();
函数的实现不需要static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突;道理和如果不使用static会引起的问题和第3点一样;不要在头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则在cpp内部声明需要加上static修饰;在C语言中这点由为重要!
相关推荐
综上所述,static关键字在C++中有三种主要的使用场景:静态全局变量、静态局部变量和静态函数。静态全局变量和静态局部变量提供了存储区域的持久性,并且可以控制变量的可见性。静态函数则为函数提供了一种在单个...
### C++ `static` 关键字的原理及用法详解 #### 一、引言 在C++编程语言中,`static`关键字扮演着至关重要的角色。它不仅可以用来控制变量和函数的可见性和生命周期,还能在类的设计中发挥独特的作用。正确地理解...
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。
以上就是标题和描述中提到的C++关键字的用法和引用(&)的详细解释。了解并熟练运用这些关键字可以极大地提升C++编程的效率和代码质量。每个主题都有其深度和细节,如const的const成员函数、内联函数的实现细节、...
"关于static关键字的总结" static 关键字是 Java 语言中一个非常重要的概念,它可以用来修饰变量、方法、内部类和代码块等。下面我们将详细介绍 static 关键字的由来、作用和用法。 一、static 关键字的由来 在 ...
Java 中 static 关键字用法总结 Java 中的 static 关键字是一个非常重要的概念,它可以用来定义静态方法、静态变量和静态块。在 Java 中,静态方法通常在一个类中定义,它们可以在不创建类对象的情况下被调用。静态...
在实际编程中,正确理解和使用`static`关键字能帮助我们编写更高效、安全的C++代码。通过以上讨论,你应该对`static`的关键字有了深入的理解,但要记住,实际运用时还需要根据具体需求来选择合适的方式。
### C++关键字详解 在C++编程语言中,关键字具有特定的语法意义,它们由编译器识别并赋予特殊含义。下面将详细介绍一系列...以上就是C++关键字的详细介绍,了解这些关键字的功能和用法对于掌握C++编程语言至关重要。
理解`static`关键字的作用和用法对于编写高质量的Java代码至关重要。 1. **静态方法** 静态方法不需要创建对象就可以直接通过类名调用。它们属于类而不是类的实例,因此无法访问非静态成员(因为非静态成员是在...
static关键字是C/C++语言中一个非常重要的关键字,它有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。下面我们将详细介绍C/C++中的static关键字。 一、面向过程程序设计中的static 在面向...
总结来说,`static`关键字在C++中提供了多种用途,包括限制变量的作用域、在函数调用之间保持状态、以及在面向对象编程中实现类级别的共享属性和方法。理解`static`的关键在于其与作用域、内存管理和生命周期的关联...
在C/C++编程语言中,`static`和`extern`关键字扮演着至关重要的角色,它们影响着变量和函数的存储、生命周期以及作用域。下面将详细阐述这两个关键字的使用和意义。 首先,我们来看`static`关键字。在C语言中,`...
C++ static 用法总结 静态变量是 C++ 中的一个重要概念,它有多种使用方式,今天...static 关键字在 C++ 中有多种使用方式,每种方式都有其特点和应用场景,正确地使用 static 关键字可以提高程序的效率和可维护性。
### C++中Static的使用方法详解 #### 一、Static的基本概念 1. **什么是Static?** - `static`是C++中的一个重要关键字,主要用于控制变量的存储方式和可见性。 - 在C++中,`static`可以用于局部变量、全局变量...
C++语言基础 this和static关键字 C++语言基础 this和static...this和static关键字是C++语言基础中的两个重要概念,它们的用法和特点都是非常重要的。理解和掌握这两个关键字的使用可以帮助程序员更好地编写C++程序。
static是 c++ 的关键字,顾名思义是表示静态的含义。它在 c++ 中既可以修饰变量也可以修饰函数。那当我们使用 static 时,编译器究竟做了哪些事情呢? 早先面试中被问到 static 关键字,感觉既熟悉又陌生。熟悉是都...
3. `cast`系列: `const_cast`, `dynamic_cast`, `reinterpret_cast`, `static_cast`是C++中的类型转换关键字。它们分别用于改变对象的`const`或`volatile`属性、在继承层次结构中安全地转换指针或引用、执行任意的位...
在C++中,`static`关键字有着多重含义,特别是在类的上下文中,它用来定义静态成员变量和静态成员函数。让我们深入探讨一下这两个概念。...理解和合理使用`static`关键字是提升C++编程技能的重要一环。
当在C/C++中使用`static`关键字修饰全局变量或函数时,它们的可见性将被限制在当前编译单元(即包含该变量或函数声明的源文件)。这意味着其他源文件无法直接访问这些`static`修饰的全局变量和函数,从而避免了命名...
#### Static关键字的双面特征 在C语言中,通过“static”关键字声明的变量拥有两个显著的特性: 1. **持久存储**:“static”变量存储在全局存储区域,这意味着一旦被初始化,即使函数执行完毕,其值也会被保留,...