static int x = 10; int fun() {} int main() {}
这种变量在内存的 .data区,但作用域和可见性为本文件,即链接性为内部的,其他文件不可访问。
int fun(int a) { static int x = a; x = a; return x; }
对于这种情况,静态变量x 的作用域为fun()函数,但它仍然存储在.data区,生存期延长至程序结束。函数内第一条语句,是对x的初始化,不管函数执行多少次,初始化只有一次。
//file 1 int num = 10; ___________________________ //file 2 static int num = 20; void fun() { cout << num << endl; }
此时,静态变量隐藏常规的外部变量,所以会打印 静态的变量。
如果将函数定义为静态,和全局的静态变量一样,其可见性为本文件有效,同一个工程的其他文件不可用。
错误示例:
//file1 static int fun() { //... } ________________________ //file 2 int test() { int x = fun(); //error }
设计一个静态变量作为类成员。
示例代码
class Object { private: int value; static int num; public: Object(int x = 0) : value(x) { num += 1; } ~Object() { num -= 1; } Object(const Object& obj) : value(obj.value) { num += 1; } }; int Object::num = 0;
‘注意点:
示例:
int main(void) { Object obja(10); Object objb(20); return 0; }
根据监视器可以看出:
示例:在刚才类的基础上加上一个常方法
void Print() const { num += 10; cout << "value = " << this->value << "num = " << this->num << endl; } int main(void) { Object obja(10); obja.Print(); Object objb(20); objb.Print(); return 0; }
这样是可以编译通过的,可以看出对象模型里没有 num,所以即使使用const限制this指针,还是可以对 静态变量修改。
示例:如果把非静态函数Print()的内容写成静态函数,那么还能编译通过吗?
static void Show() { num += 10; cout << this->value << endl; cout << num << endl; }
注意:
静态函数和非静态函数最大的区别就是:
非静态函数有this指针,而静态函数没有this指针,所以若要输出 value,编译器会不知道输出谁的value,编译出错。