c ++中的静态变量和普通变量有什么区别?

时间:2011-03-10 05:44:28

标签: c++

我需要知道差异,我是初学者。

10 个答案:

答案 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)

  1. 静态成员是为特定类创建的所有对象共用的单个共享成员,但非静态成员不是。
  2. 内存分配只进行一次,而不是每次像非静态成员一样创建对象时。
  3. 无论创建的对象数量是多少,都只会存在一个静态数据成员副本。
  4. 静态成员函数只能访问静态成员变量,而静态和非静态成员函数都可以访问非静态成员。
  5. 当单个数据副本足够时,静态成员是有效的。

答案 6 :(得分:0)

假设class A具有静态变量x ...而不是静态变量p

现在如果你创建了一百个A类实例(即A a;)x将在这一百个实例之间共享...但是会有一百个p副本...一个p par实例的副本

答案 7 :(得分:0)

除了所有这些答案的差异之外,staticlocal变量之间还有一个差异:

local变量存储在堆栈中,而static变量存储在过程存储器的data部分中。

答案 8 :(得分:-1)

有三种不同类型的“静态”变量。

  1. 在外部函数和类中,“普通”变量将是一个全局变量。函数外部的static变量不是全局变量,而是在其定义的.cpp文件的本地变量。 (不要在头文件中定义这种类型的static变量!)

  2. 在函数内部,函数退出时会破坏正常变量。函数中的static变量即使在函数退出后也会保留其值。

  3. 在类中,普通成员属于一个对象。静态成员在该类型的所有对象之间共享,甚至在创建该类的任何对象之前存在。

答案 9 :(得分:-1)

主要“静态变量”和“局部变量”的区别

<块引用>

局部变量的内存分配在它们的工作完成后被释放, 另一方面,静态变量的内存分配保持不变 直到程序终止或被程序的另一个值覆盖

例如,假设您正在使用递归问题,如果您在递归调用期间使用局部变量,则在函数返回期间,局部变量的内存分配将被删除。

另一方面,如果您使用的是静态变量,则该变量的内存分配将一直保留到程序结束。它在函数返回时应保持其值不变,否则可以被程序覆盖。