static,C++关键字,译为“静态”,用来修饰变量或函数。
#include<iostream>
using namespace std;
void func()
{
int x = 0;
static int y = 0;
x++;
y++;
cout << x << " " << y << endl;
}
int main()
{
func(); //1 1
func(); //1 2
return 0;
}
x和y都是局部变量,但是它们有何区别呢?
(1)位置:x被放置在栈上(参见C++内存管理技术内幕);y被放置在全局 / 静态存储区。
(2)生命周期:x随函数结束而结束;y的生命周期会伴随整个程序,正因如此,y的值并不会因为函数结束而受到影响,再次调用函数,它会沿用上次调用后的值。
(3)访问权限:都只能在函数内部访问。
(4)值:x由用户指定初始值,使用未初始化变量会报错;y因为被放置全局 / 静态存储区,则会被编译器自动赋值为 0(即使这样,我们也要养成良好的编程习惯,为其给定初始值)。
class A
{
public:
int x;
static int y;
public:
static int z;
};
int A::y = 1; //不能加static,但是其类型int必须加上
int A::z = 1; //私有变量
静态成员变量必须在类外进行初始化。因为静态成员变量属于类,而不是类的对象,也就是所有对象共享它,在程序刚运行时,静态成员变量就已经存在于全局 / 静态存储区(存在与否,调试监视即可得到证实),而无所谓是否有类的对象被创建。
#include<iostream>
using namespace std;
int x = 1;
static int y = 1;
int main()
{
return 0;
}
再给大家补充一个C++中static的用处。观察上述代码,x与y唯一的区别就是:x是外部链接,y则是内部链接,参见C++链接属性。
static对函数的修饰与上所述同理,下面简单介绍下即可。
#include<iostream>
using namespace std;
static void func() //函数属性为内部链接,只在本单元使用,不会与其他文件的相同形式函数发生冲突
{
;
}
class A
{
public:
static void func1(); //属于类,而不是对象,为所有对象共享
};
void A::func1()
{
;
}
int main()
{
A one;
A::func1(); //两种访问方式,皆可
one.func1();
return 0;
}
此外,在类的静态成员函数中不可以使用类的非静态成员,
#include <stdio.h>
class Point
{
public:
void init()
{
}
static void output()
{
printf("%d\n", m_x);
}
private:
int m_x;
};
void main()
{
Point pt;
pt.output(); //error
}
因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,就好比没有声明一个变量却提前使用它一样。