我需要知道差异,我是初学者。
答案 0 :(得分:7)
void func()
{
static int static_var=1;
int non_static_var=1;
static_var++;
non_static_var++;
cout<<"Static="<<static_var;
cout<<"NonStatic="<<non_static_var;
}
void main()
{
clrscr();
int i;
for (i=0;i<5;i++)
{
func();
}
getch();
}
以上输出为:
Static=2
Nonstatic=2
Static=3
Nonstatic=2
Static=4
Nonstatic=2
Static=5
Nonstatic=2
Static=6
Nonstatic=2
静态变量保留其值,而非静态或动态变量在每次调用函数时初始化为“1”。希望有所帮助。
答案 1 :(得分:4)
静态变量是与该类关联的单个内存位置。
非静态变量(即类的成员)表示该类的每个实例的不同内存位置。
静态变量只能初始化一次,并在创建对象时分配给0。
答案 2 :(得分:3)
static
命名空间范围变量具有内部链接,而非static
命名空间范围变量默认具有外部链接! 详细信息:默认情况下,const
命名空间范围变量具有内部链接。该关联可以通过关键字extern
更改。static
变量与类相关联,这意味着该类的所有实例都具有相同的静态变量实例;它们就像相同类的每个实例都可以访问的全局变量。static
变量是实例成员,也就是说,该类的每个实例都有自己的非static
变量实例。static
数据成员具有外部链接。 [$ 7.2 / 10] static
变量即使在从函数返回后也会保留其值。
也就是说,它的寿命等于程序本身的寿命。这在Mahesh's answer。答案 3 :(得分:2)
静态变量和普通变量的主要区别在于它们的生命周期,例如局部变量的范围和生命周期在声明它的函数循环中,但静态变量的范围与局部变量相同意味着它将被访问声明的函数(如果没有全局定义),但生命周期是通过程序。因此内存分配取决于生命周期,因此静态变量在程序终止之前不会消失,因此没有分配新内存,因此每次更改变量值时,分配给静态变量的固定内存地址和该地址中的值都会被覆盖,而对于正常变量,一旦你超出范围,变量就会死亡(意味着将为该变量释放内存),当你再次定义变量时,将分配新的内存地址,新值将存储在地址中,没有概念覆盖(当我们超出范围时)。
答案 4 :(得分:1)
静态变量在函数调用/循环期间保留其值,但局部变量不保留;
#include <iostream>
void foo()
{
for( int i=0; i<5; ++i )
{
static int staticVariable = 0;
int local = 0;
++local;
++staticVariable;
cout << local << "\t" << staticVariable << "\n";
}
}
int main()
{
foo();
return 0;
}
<强>结果:强>
1 1
1 2
1 3
1 4
1 5
当静态变量是类的成员时,每个实例共享静态变量。每个实例都没有自己的副本。
class foo
{
public:
static int staticVariable;
};
int foo::staticVariable = 0;
foo obj1, obj2 ; // Both the instances share the static variable.
答案 5 :(得分:1)
答案 6 :(得分:0)
假设class A
具有静态变量x ...而不是静态变量p
现在如果你创建了一百个A类实例(即A a;
)x将在这一百个实例之间共享...但是会有一百个p副本...一个p par实例的副本
答案 7 :(得分:0)
除了所有这些答案的差异之外,static
和local
变量之间还有一个差异:
local
变量存储在堆栈中,而static
变量存储在过程存储器的data
部分中。
答案 8 :(得分:-1)
有三种不同类型的“静态”变量。
在外部函数和类中,“普通”变量将是一个全局变量。函数外部的static
变量不是全局变量,而是在其定义的.cpp文件的本地变量。 (不要在头文件中定义这种类型的static
变量!)
在函数内部,函数退出时会破坏正常变量。函数中的static
变量即使在函数退出后也会保留其值。
在类中,普通成员属于一个对象。静态成员在该类型的所有对象之间共享,甚至在创建该类的任何对象之前存在。
答案 9 :(得分:-1)
主要“静态变量”和“局部变量”的区别
<块引用>局部变量的内存分配在它们的工作完成后被释放, 另一方面,静态变量的内存分配保持不变 直到程序终止或被程序的另一个值覆盖。
例如,假设您正在使用递归问题,如果您在递归调用期间使用局部变量,则在函数返回期间,局部变量的内存分配将被删除。
另一方面,如果您使用的是静态变量,则该变量的内存分配将一直保留到程序结束。它在函数返回时应保持其值不变,否则可以被程序覆盖。