static 申明变量或函数为静态;静态的函数或者变量使该变量或者函数只能作用于本文件。通俗点讲就是,只能是本文件内部使用,其他文件哪怕是定义一个相同的都与我无关,编译器也不会报错。这也是其好处;未经初始化的静态变量初值都为0;静态变量都再全局数据区存储;包括静态全局变量,静态局部变量;
在内存中的分布情况如下: 代码区 //low address
全局数据区
堆区
栈区 //high address 一般程序把新产生的动态数据 存放在堆区,函数内部的自动变量 存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静 态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。
静态局部变量有以下特点:
该变量在全局数据区分配内存;
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
静态函数:
在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。静态的类数据成员分配在全局区,哪怕是该类没有实例化一个对象,我们都可以访问它;静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静态数据成员;
eg:1.cpp中定义char a;如果想在2.cpp中使用,那么2,cpp中使用时,这么用extern char a;
如果定义char a[5];定义一个数组,在 2.cpp中要要使用该数字,那么必须这么声明 extern char a[]; 如果是申明为extern char *a;会出错,原因是extern char *a,只告诉编译器有一个外部的指向字符串的指针。声明可以多次使用,可以在多个文件中使用。int a ,与extern int a ,一个是定义一个变量,一个是申明一个变量,大爷的。细节啊;全部交给大学老师了.......汗
在一个文件中定义一个函数,声明为外部extern
eg: 1.cpp中定义如下函数:
#include "stdafx.h"
#include"iostream"
using namespace std;
//extern static my aa;
//extern static my bb; //如果申明为static 则有错误;
extern my aa; // 在2.cpp中定义的全局变量
extern my bb; //
void fun()
{
cout<<"test static aa:"<<aa.a<<endl;
cout<<"test static aa:"<<aa.b<<endl;
cout<<"test static aa:"<<bb.a<<endl;
cout<<"test static aa:"<<bb.a<<endl;
}
在2.cpp中定义了
#pragma once
#include "stdafx.h"
#include"iostream"
using namespace std;
my aa,bb; // 定义两个全局自定义的结构体。在stdafx,h中
//static my aa,bb; //如果是静态的,则,fun()函数里的变量永远都是0,不会随2.cpp赋值而改变;
extern int temp1;
extern void fun();
int _tmain(int argc, _TCHAR* argv[])
{
bb.a =1;
bb.b =1;
aa.a =0;
aa.b=0;
cout<<aa.a <<" "<<aa.b <<endl;
cout<<bb.a <<" "<<bb.b <<endl;
cout<<temp1<<endl;
fun();
system("pause");
return 0;
}
输出的结果如人所愿。