在C/C++中,static有两种含义:
1. 在固定的地址上进行存储分配,即对象在一个特殊的静态数据区(static data area)上创建 ------ 静态存储
2. 对于一个特定的编译单元是局部的 ------ C++局限于类
针对第一个点,最先想到的就是变量,由编译器在静态数据区为其分配内存空间;static负责创建的变量称之为静态变量,例如:函数内部的静态变量,类的静态数据成员和静态函数等。
函数内部的静态变量:只在函数的第一次调用时进行初始化,之后的函数调用中将保留静态变量的值。
类的静态数据成员:编译器在静态数据区创建,属于类,所以对象共享静态数据成员的存储区。
类得静态成员函数:和静态数据成员函数相似,属于类所以,对象共有,但不能调用普通的成员函数和成员变量;
下面详细对static的几点用法做说明:
1.函数内部的静态变量
函数内部的静态变量只在函数的第一次调用时初始化,之后的函数的调用中将保留静态变量的值;
例如:你想知道一个函数被调用了多少次,静态变量可以轻松的解决这个问题;函数内部的静态变量只在函数的第一次调用时初始化,之后的函数的调用中将保留静态变量的值;
#include <stdio.h>
int fun()
{
static int count = 0;
count++;
return count;
}
int main()
{
int sumCount;
int index;
for (index=0; index<10; index++)
{
sumCount = fun();
}
printf("%d\n",sumCount);
system("pause");
return 0;
}
//结果: 10
由上面的代码可以看出,函数内部的静态变量只在函数的第一次调用时初始化,之后在调用fun()函数,count中保留着上次调用的值,并非又重新初始化为0;在后面的调用中将已现保留的值进行计算.
2.函数内部的静态对象
对象,更多的是牵扯到用户自定义的数据类型,而对于用户自定义的数据类型必须用构造函数来初始化,所以在定义一个静态对象时没有指定构造函数参数,这个类必须有默认的构造函数。
静态函数的析构函数在程序main()中退出时,活着C标准库exit()函数被调用时才被调用,多数情况下main()函数的结束也是调用exit()函数结束程序的,所以在析构函数内部使用exit()是很危险的,很容易造成无穷的递归调用,但是在使用标准的C库函数abort()来退出程序,静态对象的析构函数是不会被调用的。
3.类中的静态数据成员
类的静态数据成员拥有一块单独的存储区,它是属于类。不管创造多少个对象,这些对象共享静态数据成员的存储区域,而且它的名字在类的作用域范围内有效;同时也应该注意的是静态数据成员的定义(初始化)必须出现的类的外部(不允许内联);
class A
{
statci int i;
public:
//...
}
int A::i = 0;
这样的定义,我们会想到int i 是私有成员,而在类的外部进行定义,破会了类得安全性,但是在C++中有两点保证了它是绝对安全的:
a. 这些变量的初始化唯一合法的地方在定义时。
b. 一旦这些数据被定义了,最终的用户就不能在定义它。
4.静态成员函数
静态成员函数和静态数据成员有着一样的特性,属于类共有;类得静态成员函数不能访问一般的数据成员,只能访问静态数据成员,也只能调用静态成员函数;这是因为在静态成员函数中没有this 指针。
通常类中成员函数调用时,对象的地址(this)是被隐式的传递到被调用的函数的,由于静态成员存储在特殊位置,并且没有对象的地址的传递,所以是不能够调用一般的数据成员和成员函数的
class X
{
int i;
static int j;
public:
X(int ii):i(ii)
{
j = i;
}
int val() const { return i;}
static int incr()
{
//i++; //error
return j++;
}
static int f()
{
//val(); //error
return incr();
}
};
新手,了解的不够深,以后有更深层次的了解之后会追加的!作为学习过程中的一种总结吧...