static关键字在编程中非常容易混淆,因为它用于不同的“上下文环境”有不同的作用和意思,现在我们来吧static关键字进行一个总结,希望能对看到这篇文章的人能有所帮助。
C语言中static关键字主要有以下作用:
1、修饰变量:
static可以修饰全局变量和局部变量。它们都存储在静态区当中。
a、静态全局变量:
static修饰的全部变量称为静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它,也就是说静态全局变量不具有外部链接属性。
</pre>例如:<pre name="code" class="cpp">//test_8_16.cpp
#include <iostream>
using namespace std;
static int count;
#include "test_8_16.cpp"
int main()
{
std::cout << count << endl;
return 0;
}
在test_8_16.cpp文件中定义了一个静态全部变量 count,并在另一个文件中包含了test_8_16的cpp文件,当我在这个文件中使用count时,编译器报出以下错误
b、静态局部变量:
静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了。由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。
2、修饰函数
修饰函数。函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
3、在C++中,修饰类的成员变量
在C++中,用static修饰的类的成员变量称为类的静态成员,类的静态成员只与类本身相关而不与类的各个对象产生关联,并且类的静态成员尽管在类中有申明,但它存在于任何对象之外,对象中不会包含任何与静态成员有关的数据,又由于类的静态成员变量和方法不与任何对象绑定在一起,所以静态成员函数不包含this指针,同时静态成员函数也不能声明为const类型的。
使用类的成员变量:
可以使用作用域运算符和类型来直接访问类的静态静态成员:
class Date
{
public:
Date()
{
cout << "Date ()" << endl;
++sCount;
}
void Display()
{
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl;
}
// 静态成员函数
static void PrintCount() //静态成员函数只能访问静态成员
{
cout << "Date count:" << sCount << endl;
}
private:
int Return_count()
{
return 0;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
private:
static int sCount ; // 静态成员变量,统计创建时间个数
static int Initcount();
static Date date; // 可以再一个类中,用该类的类型来声明一个静态成员变量
//不完全类型: 有声明,却没有定义的类型
//Date date1;
Date* date1;
};
在上面的程序中我们定义了类的静态成员变量 sCount和类的静态成员函数Initcount( )。由于静态成员变量不关联任何对象,只与类本省相关。所以对象的生命周期包含在静态成员变量的生命周期中,所以我们可以用sCount来统计Date类对象的创建个数。同时我们还应该注意,静态成员在类中只能是声明,不能是定义,要在类外去定义静态成员变量。
Date类的静态成员变量和函数定义如下:
int Date::Initcount()
{
return 0;
}
// 定义并初始化静态成员变量
int Date::sCount =Initcount(); //注: 静态成员变量必须在类外进行初始化 在类中只能是声明