面试题——static详解

本文详细介绍了C++和C#中的static关键字的用法,包括静态全局变量、静态局部变量、静态函数以及在面向对象编程中的静态成员。在C++中,static用于限制变量的作用域,确保数据的共享和持久性,同时避免命名冲突。在类中,静态数据成员和静态成员函数为类的所有对象共享,不依赖于特定对象,而静态函数不能访问非静态成员。此外,C语言中的static关键字也有类似作用,用于隐藏内部函数和实现变量持久化。

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

    简单介绍:   像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算

机语言如FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、PROLOG、Ada等语言中也是

有出现的,只是有着不同的作用,对于其具体作用,读者有需要的时候是可以具体查阅的。我只介绍在C和C++以及

静态类中它的使用。

一、 C++中

1、 C++与C#的static有两种用法:面向过程程序设计中的static面向对象程序设计中的static。前者应用于普通变

量和函数,不涉及类; 后者主要说明static在类中的作用。

[1] 面向过程

静态全局变量

     在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,

如下:

 //Example1

 #include<iostream>

 usingnamespace std; 

void fn(); //声明函数 

static int n; //声明静态全局变量 

void main()

 {

        n=20; //为n赋初值

        printf("%d",n);//输出n的值 

        fn(); //调用fn函数

 } 

void fn() 

{

        n++; //n的值自加一(n=n+1) 

        printf("%d",n); //输出n的值 

}

 静态全局变量有以下特点

(1)该变量在全局数据区分配内存

     未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初

始化,而在函数体外被声明的自动变量也会被初始化为0);静态全局变量在声明它的整个文件都是可见的,而在文

件之外是不可见的;静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。

    一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释

放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退

出而释放空间。细心的读者可能会发现:Example 1中的代码中将 static int n; //定义静态全局变量   改为 int n; //定

义全局变量程序照样正常运行。的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下

好处:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突;您可以将上述示例

代码改为如下:

 //Example2 

//File1第一个代码文件的代码

 #include <iostream>

usingnamespase std;

void fn(); //声明fn函数

 static int n; //定义静态全局变量 

void main() 

      n=20; 

      cout<n<endl;

      fn();

}

//File2第二个代码文件的代码

#include<iostream>

 extern int n;

 void fn() 

{

     n++;

     printf("%d",n); 

}

 编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。试着将 static int n; //定义静

态全局变量  改为 int n; //定义全局变量   再次编译运行程序,细心体会全局变量和静态全局变量的区别。

注意:全局变量和全局静态变量的区别 

1)全局变量是不显式用static修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内

定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。 

2)全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也

不能使用。

静态局部变量

在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。

我们先举一个静态局部变量的例子,如下 

//Example3 

#include <iostream>

#include <stdio.h> 

void fn();

 void main() 

      fn(); 

      fn(); 

      fn(); 

void fn() 

{

      static int n=10;

      printf("%d",n); 

      n++;

 }

    通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数

体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量的值进行保存。通常的想

法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带

来不便。静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持

到下一次调用,直到下次赋新值。

静态局部变量有以下特点

(2)该变量在全局数据区分配内存:

 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;静态局部变量一般

在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;它始终驻留在全局数据区,直到程序运行结束。

但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

2、静态函数

  在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文

件当中可见,不能被其它文件使用。静态函数的例子:

 //Example4

 #include <iostream>

usingnamespace std;

static void fn();//声明静态函数

void main() 

{

      fn(); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值