优秀的编程知识分享平台

网站首页 > 技术文章 正文

C++ static关键字到底有什么作用(c++中的static关键字)

nanyue 2024-07-26 15:44:12 技术文章 4 ℃

在文章开头先写总结吧,省的文章太长大家看的又晕。简单总结下来static关键字具有以下两点作用:改变变量的生命周期和限定作用域

1、改变变量的生命周期

我们都知道在函数中申明的局部变量在函数调用完成后即会被释放,但是由static申明的局部变量的生存周期是长于函数的,也就是说即使函数调用结束后该变量的内存也不会被释放。下面我们直接看代码:

#include <stdio.h>

#include <iostream>

void func()

{

int i = 1 ;

static int i_static = 1;

i ++ ;

i_static ++ ;

std::cout<<"i:"<<i<<std::endl<<"i_staic:"<<i_static<<std::endl ;

}

int main()

{

std::cout<<"first run:"<<std::endl ;

func();

std::cout<<"sencond run:"<<std::endl ;

func();

system("pause");

}

我们运行起来看结果:

first run:

i:2

i_staic:2

sencond run:

i:2

i_staic:3

这样就很清楚了吧:i是普通局部变量的申明方式,在每次函数调用时都会重新分配内存重新初始化,在函数结束后该内存就会被自动释放。但是static声明的局部变量随着第一次函数的调用而初始化,却不随着函数的调用结束而销毁,而是一直存在直至程序结束。具体原理是什么这个就牵涉到C++程序内存的分配原则了。有兴趣的朋友可以关注小编,下一篇为大家详细讲解。

2、限定作用域

用static申明的变量和函数作用域都仅限本文件。关于限定作用域必须得结合C++的另外一个关键字‘extern’来讲解(修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用。关于extern关键字的作用,关注小编后续为大家分享)。好,废话不多说直接上代码(程序猿就是这样,看代码比看文字舒服多了,嘿嘿)

这里有两个 .Cpp 文件其中a.cpp中代码如下:

#include <iostream>

int test01 = 10 ;

static int test02 = 11 ;

void func1()

{

std::cout<<"no static func"<<std::endl;

}

static void func2()

{

std::cout<<"static func"<<std::endl;

}

在这里定义了两个变量(一个静态一个非静态)和两个函数(一个静态一个非静态),然后再另外一个‘源.cpp’中引用他们,我们看运行结果是什么样的(注意看注释的代码)

using namespace std ;

extern int test01 ;

//extern int test02 ;

extern void func1();

extern void func2();

int main()

{

cout<<test01<<endl;

//cout<<test02<<endl;

func1();

//func2();

system("pause");

}

按照现在的代码运行结果是:

10

no static func"

但是当我将注释的代码放开然后编译运行就会报错:

这是因为在extern在寻找test02和func2的时候在a.cpp中被static给屏蔽掉(因为static的作用就是限定test02和func2的作用域只是作用于本文件即a.cpp文件)

好了,现在大家应该对于static的作用已经有了很全面的认识了吧!希望我的分享能够帮助大家,祝大家长发飘飘~~~

最近发表
标签列表