static关键字代表静态,它可以作用于变量以及函数。例如,在局部变量前面加上static关键字后,就定义了静态局部变量,在函数的返回类型前加上static关键字后,就定义了静态函数。在C++的面向对象编程中,static还可以加在类的数据成员或成员函数之前,这样定义的数据成员函数就被类所拥有,而不再属于类的对象。
10.static有什么作用?至少说明两种
1.在函数体,一个被声明为静态的变量在函数被调用的过程中维持其值不变。
2.在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其他函数访问。它是一个本地的全局变量。
3.在模块内,被声明为静态的函数只能被这一模块内的其他函数调用。即函数被限制在声明它的模块范围内。
11.static全局变量与普通变量有什么区别?static局部变量和普通变量有什么区别?static函数与普通函数有什么区别?
全局变量的声明之前加上static就构成了静态的全局变量。全局变量本身就是静态存储变量,静态全局变量当然也是静态存储变量。这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一个源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。
请看以下例子:
安装以下结构创建工程:
//hfile.h
extern int a; //声明全局变量
//file1
#include <stdio.h>
#include "hfile.h"
void substract(void){
a--;
}
//file2
#include <stdio.h>
#include "hfile.h"
void plus(void){
a=a+2;
}
在mainfile.cpp中声明定义了一个全局变量,全局变量默认是动态的,作用域是整个工程:
//mainfile.cpp
void plus(void);
void substract(void);
int a=1; //定义全局变量a
int main(){
printf("%d\n",a);
plus();
printf("%d\n",a);
substract();
printf("%d\n",a);
system("pause");
}
程序运行结果:
如果在mainfile.cpp修改成声明定义静态全局变量:
#include <stdio.h>
#include <stdlib.h>
void plus(void);
void substract(void);
static int a=1; //定义静态全局变量a
int main(){
printf("%d\n",a);
plus();
printf("%d\n",a);
substract();
printf("%d\n",a);
system("pause");
}
程序运行报错:
原因在于静态全局变量a的作用域局限于文件mainfile.cpp中,不能再其他文件使用。
把局部变量改变为静态局部变量后是改变了它的存储方式(局部变量是栈区分配,静态局部变量是在静态存储区分配),即改变了它的生存期。把全局变量改变为静态全局变量后是改变了它的作用域,即限制了它的使用范围。
static函数与普通函数作用域不同,其作用域仅仅在本文件中(它们的关系和全局变量-静态全局变量的关系一样)。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。
答案:
static全局变量与普通全局变量的区别是:static全局变量只初始化一次,防止其他源文件单元中被引用。
static局部变量与普通变量的区别是:static局部变量只被初始化一次,下一次依据上一次结果值。
static函数与普通函数的区别是:static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品。
分析代码写结果–C++类的静态成员
#include <iostream>
using namespace std;
class widget{
public:
widget(){
count++;
}
~widget(){
count--;
}
static int num(){
return count;
}
private:
static int count;
};
int widget::count=0; //静态成员初始化
int main(){
widget x,y;
cout<<"The Num is"<<widget::num()<<endl;
if(widget::num()>1){
widget x,y,z;
cout<<"The Num is"<<widget::num()<<endl;
}
widget z;
cout<<"The Num is"<<widget::num()<<endl;
system("pause");
}