static
1.局部变量
// 该变量生命周期不仅仅是进入该函数后,而是整个程序运行期间
void foo()
{
static int nVar = 0;
printf("var = %d\n", ++nVar);
}
2.保护本地变量
static int g_nVar; // g_nVar只能在本文件中使用,其他文件不能通过extern访问该变量
3.静态成员变量
// 该变量不属于对象,而属于这个类
class Foo
{
public:
static int nCount;
};
int Foo::nCount = 0;
int main()
{
cout << Foo::nCount << endl;
return 0;
}
4.静态成员函数
// 该函数不属于对象,而属于这个类
class Foo
{
public:
static void ShowClassTag();
};
void Foo::ShowClassTag()
{
cout << "class Foo" << endl;
}
int main()
{
Foo::ShowClassTag();
return 0;
}
5.静态全局函数
static int ModuleFunc(); // 该函数只有本模块可调用
const
1.定义常量
const int nItem = 0;
const int* pnItem = &nItem;
2.保护变量不被外部使用
//file1.c
const int g_nLocalVar = 100;
int g_nVar = 100;
//file2.c
extern const int g_nLocalVar; // 非法声明
extern int g_nVar; // 合法
3.表明成员函数不会修改成员变量
class A
{
private:
intage;
charname[32];
public:
voidShowInfo() const;// 表明该函数不会修改类对象
voidSetName(const char* pName);
const char*GetName()const;// 表明该函数不会修改类对象
};
extern
1.声明所引用对象已被定义
extern int g_nFoo;
int main()
{
g_nFoo++;
cout << g_nFoo << endl;
return 0;
}
int g_nFoo = 0;
2.声明该变量可被外部使用
// file1.c
extern const int g_nItem;
int main()
{
cout << g_nItem << endl;
return 0;
}
// file2.c
// 如果此处不加extern,该变量不能被外部访问的
extern const int g_nItem = 100;
3.声明函数的编译连接方式
为了保持兼容性,使得函数的编译连接适用于混合编程,需要在C++的函数声明前添加extern "C"的声明,如下所示:// C++默认的编译方式,为了支持重载,函数符号名有参数信息类似于 __MyFunc_int
int MyFunc(int n)
{
if(n <= 0)
{
return 0;
}
else
{
return n + MyFunc(n-1);
}
}
// 声明为C风格的编译链接方式,符号名类似于__MyFunc,无参数类型信息
extern "C" int MyFunc(int n)
{
if(n <= 0)
{
return 0;
}
else
{
return n + MyFunc(n-1);
}
}
一般动态链接库的导出函数都是使用这种方式声明,使得C++得导出函数支持C代码调用。