C++ static静态变量的作用总结

您所在的位置:网站首页 static变量在其他文件中访问 C++ static静态变量的作用总结

C++ static静态变量的作用总结

2024-03-29 00:24| 来源: 网络整理| 查看: 265

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)

当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 举例来说明,同时编译两个源文件,一个是a.c,另一个是main.c。

//a.c char a = 'A'; // global variable void msg() { printf("Hello\n"); } //main.c int main() { extern char a; // extern variable must be declared before use printf("%c ", a); (void)msg(); return 0; }

程序运行结果

A Hello

为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。

2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见

PS:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

举例来说:

#include int fun(){ static int count = 10; //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,a return count--; //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局变量: } int count = 1; int main(void) { printf("global\t\tlocal static\n"); for(; count public: static int size; std::vector vec(size); //error };

在编译器中,vec(size)编译不通过,Unknown type name 'size',问题在于如(7),(8)所说,此时size并未初始化。

先来搞清楚声明、定义、初始化三个概念的区别:

声明:指定变量的名字和类型,可以多次声明。

定义:为该成员变量分配存储空间,有且仅有一个定义(定义也可以为声明)。

初始化:为该成员变量赋初值。

PS:

头文件中定义与声明

注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量,C++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次。

不过有三个例外,一下三中实体的定义也可放到头文件中。 1.值在编译时就已知的const 变量的定义可以放到头文件中 如:const int num(10);

2.类的定义可以放到头文件中

3.inline 函数

这三个实体可以定义在多个源文件中,只要在每个源文件中的定义相同

如果想在类中初始化这个vector容器的话,可以写一个构造函数,比如:

class example{ public: //static const int size; std::vector vec; example():vec(5){} };

类成员的定义和初始化: 1,类内成员在被定义时是不能被初始化的,只能通过构造函数来进行初始化。 2,类内静态变量的初始化方式是先在类内定义,再到类外面进行初始化。

现在回到static的初始化就能明白了,还是一个错误的例子:

#include #include class example{ public: //static double rate=6.5; static int size; int get(){ return size; } }; using namespace std; int main(){ example e; cout return size; } }; int example:: size; // int exmaple:: size = 0; using namespace std; int main(){ example e; cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3