


C/C++培训
达内IT学院
400-996-5531

1、c语言中static关键字用法
c语言中static主要包括静态局部变量、静态全局变量和静态函数三种。
1.1 静态局部变量
该变量在函数中生成,但该变量生命周期长于函数生命周期。
示例程序如下:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
void fun1()
{
static int staticVar = 1;
int var = 1;
staticVar += 1;
var += 1;
cout << "staticVar =" << staticVar << endl;
cout << "var =" << var << endl;
}
int main(int argc, char* argv[])
{
fun1();
fun1();
system("pause");
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
运行结果如下图:
staticVar由于是静态局部变量,在第一次调用fun1()函数时初始化,在第二次调用fun1()函数时,由于staticVar保存在全局数据区,即忽略掉static int staticVar = 1;所以staticVal在第二次调用的初始值为2,而var在每次调用fun1()函数时都重新申请,故每次调用fun1()函数时,var的值不变。
1.2 静态全局变量
变量定义在函数体外,用于修饰全局变量,在本文件内可见。
代码如下:
////////////////////////////////////////////////////////
//file static1.cpp
static int staticVal = 1;
int var = 1;
//file static2.cpp
#include <iostream>
using namespace std;
extern int staticVal;
extern int var;
int main(int argc, char* argv[])
{
cout << "staticVar =" << staticVal << endl;
cout << "var =" << var << endl;
system("pause");
return 0;
}
////////////////////////////////////////////////////////
编译时报错如下:error LNK2001: unresolved external symbol "int staticVal"。
即普通变量var可以在其他文件中使用,而静态变量staticVal只能在本文件中使用。
1.3 静态函数
静态函数和静态全局变量类似,即该函数只能在本文件内使用。
2、c++中static关键字用法
c语言中static的用法同样适用于c++,但c++还多两种用法,即静态成员变量和静态成员函数。
2.1 静态成员变量
静态成员变量生命周期大于对象实例生命周期,静态数据成员每个对象有一个,如该对象有多个实例也只有一个。普通数据成员每个实例都有一个拷贝。示例如下:
/////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
class c1
{
private:
int m_w;
int m_h;
static int m_sum;
public:
c1(int w, int h)
{
m_w = w;
m_h = h;
m_sum += (m_h + m_w);
}
void GetSum()
{
cout<<"sum = "<<m_sum<<endl;
}
~c1()
{}
};
int c1::m_sum = 0; //初始化
int main(int argc, char* argv[])
{
cout<<"sizeof(c1)="<<sizeof(c1)<<endl;
c1 *rect1 = new c1(1,1);
rect1->GetSum();
cout<<"sizeof(rect1)="<<sizeof(*rect1)<<endl;
c1 rect2(1,1);
rect2.GetSum();
cout<<"sizeof(rect2)="<<sizeof(rect2)<<endl;
system("pause");
return 0;
}
/////////////////////////////////////////////////////////////////
运行结果如下图:
sizeof(c1)=8表示静态成员变量保存在全局数据区不占用类的存储空间,两次的sum值不同表示静态成员变量只会初始化一次。
2.2 静态成员函数
非静态成员函数可以访问静态或非静态成员变量,也可访问静态或非静态成员函数;静态成员函数只能访问静态成员变量和静态成员函数。如将上例
void GetSum()
{
cout<<"sum = "<<m_sum<<endl;
}
改为:
static void GetSum()
{
cout<<"sum = "<<m_sum<<endl;
}
程序可以正常运行。如将程序改为如下情况,程序会报错。
static void GetSum()
{
cout<<"sum = "<<m_w<<endl;
cout<<"sum = "<<m_sum<<endl;
}
因为m_w为非静态成员。
本文内容转载自网络,本着分享与传播的原则,版权归原作者所有,如有侵权请联系我们进行删除!
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有