如果我写这样的东西:
#include <iostream>
int main()
{
using namespace std;
{int n;n=5;} cout<<n;
system("pause");
return 0;
}
编译器告诉我 n 未声明。然后我尝试将其设为静态,但编译器再次告诉我它未声明。声明为 static 的变量没有程序作用域吗?如果没有,我该如何在这个程序中使用 n ?
您混淆了范围和生命周期。静态变量的生命周期与程序的生命周期相同,但它们仍然遵循基于声明位置的作用域规则。
n的范围就在括号之间:
{int n;n=5;}
所以在块之外,你没有 n 变量。
将其设为静态只会使其值在退出块后保留,以便下次再次进入该块时,您可以检索上次执行该块时的值,但它的范围仍然在括号内。
在全局作用域中声明为静态的变量,其作用域仅限于翻译单元。在函数内声明为静态的变量的生命周期设置为与程序的生命周期相同,但在这种情况下不会影响其作用域。您必须将
cout
置于与声明 n
相同的范围内才能使用它。
这里编译器给出错误 n is undeclared 因为这里“{int n;n=5;}”它是在大括号中声明的。大括号告诉我们变量的范围。 作用域结束时,变量将从内存中删除。
对于静态和本地。
静态:该变量与全局变量相同,但其值在整个应用程序中保持不变。并且静态变量不能在其他页面使用extern使用。
Local:局部变量存储在堆栈中,当它们超出范围时被删除。
如何在这个程序中使用n?
using namespace std;
int main()
{
int n; // declare n as int
n=5; // assign it a value
cout << n; // display it.
system("pause");
return 0;
}
请不要混淆静态变量的范围和生命周期。范围意味着您可以在哪里访问变量。变量的生命周期是指变量在内存中停留的时间。就你而言, x 变量的范围在花括号内。 x 的生命周期将是程序范围。
在可访问性方面考虑以下全局静态范围的示例
#include <iostream>
using namespace std;
static int y;
class A {
public:
void increment() {
++y;
}
};
class B {
public:
void increment() {
++y;
}
};
int main()
{
A a;
a.increment();
cout << y << endl;
A b;
b.increment();
cout << y << endl;
B c;
c.increment();
cout << y;
return 0;
}
1 2 3
这里全局静态变量访问是在 A 类和 B 类中进行的。
在可访问性方面考虑以下类静态范围的示例
#include <iostream>
using namespace std;
class A {
public:
static int y;
void increment() {
++y;
}
};
class B {
public:
static int x;
void increment() {
++x;
}
};
int A::y = 1;
int B::x = 1;
int main()
{
A a;
a.increment();
cout << a.y << endl;
A b;
b.increment();
cout << b.y << endl;
B c;
c.increment();
cout << c.x;
return 0;
}
2 3 2
这里静态变量 y 范围是 A 类,x 范围是 B 类。 如果您尝试使用 B 类对象访问静态变量 y,那么它将返回错误。 (B b -> b.y)
静态变量 x 和 y 的生命周期都保持到 main 结束。