静态和常量variables有什么区别?

有人可以解释一个staticconstvariables之间的区别吗?

恒定的值不能改变。 一个静态variables存在于一个函数或类中,而不是一个实例或对象。

这两个概念不是相互排斥的,可以一起使用。

简短的回答:

const是一个承诺,你不会尝试修改一次设置的值。

staticvariables意味着对象的生命周期是程序的整个执行过程,它的值在程序启动前仅被初始化一次。 如果你没有明确地设置一个值,那么所有的静态都被初始化。静态初始化的方式和时间是不确定的

C99从C ++借用了const的使用。 另一方面, static一直是许多辩论(两种语言)的来源,因为它经常混淆语义。

而且,在C ++ 0x之前,C ++ 11中不再使用static关键字来声明名称空间范围中的对象。 由于各种原因,这个弃用在C ++ 11中被删除(见这里 )。

更长的答案:更多的关键字比你想知道的(从标准的权利):

C99

 #include <fenv.h> #pragma STDC FENV_ACCESS ON /* file scope, static storage, internal linkage */ static int i1; // tentative definition, internal linkage extern int i1; // tentative definition, internal linkage int i2; // external linkage, automatic duration (effectively lifetime of program) int *p = (int []){2, 4}; // unnamed array has static storage /* effect on string literals */ char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable char *p = (char []){"/tmp/fileXXXXXX"}; // static, modifiable const char *cp = (const char []){"/tmp/fileXXXXXX"} // static, non-modifiable void f(int m) { static int vla[ m ]; // err float w[] = { 0.0/0.0 }; // raises an exception /* block scope, static storage, no-linkage */ static float x = 0.0/0.0; // does not raise an exception /* ... */ /* effect on string literals */ char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable char *p = (char []){"/tmp/fileXXXXXX"}; // automatic storage, modifiable const char *cp = (const char []){"/tmp/fileXXXXXX"} // automatic storage, non-modifiable } inline void bar(void) { const static int x = 42; // ok // Note: Since an inline definition is distinct from the // corresponding external definition and from any other // corresponding inline definitions in other translation // units, all corresponding objects with static storage // duration are also distinct in each of the definitions static int y = -42; // error, inline function definition } // the last declaration also specifies that the argument // corresponding to a in any call to f must be a non-null // pointer to the first of at least three arrays of 5 doubles void f(double a[static 3][5]); static void g(void); // internal linkage 

C ++

除了在简短的回答中提到的之外,大部分都具有相同的语义。 此外,没有参数限定static

 extern "C" { static void f4(); // the name of the function f4 has // internal linkage (not C language // linkage) and the function's type // has C language linkage. } class S { mutable static int i; // err mutable static int j; // err static int k; // ok, all instances share the same member }; inline void bar(void) { const static int x = 42; // ok static int y = -42; // ok } 

还有一些C ++的static细节,我在这里省略了。 看看书或标准。

常量不能改变,静态variables更多的是如何分配和访问。

看看这个网站 。

静态variables:

  • 只初始化一次。
  • 静态variables是为类(而不是每个对象)。 即每个类只分配一次内存,每个实例都使用它。 所以如果一个对象修改了它的值,那么修改的值对其他对象也是可见的。 (一个简单的想法..要知道为一个类创build的对象的数量,我们可以把一个静态variables,并在构造函数做++)
  • 值在不同的函数调用之间依然存在

常量variables:

  • Constvariables是一个承诺,你不会在程序中的任何地方改变它的值。 如果你这样做,它会抱怨。

类的上下文中的静态variables在类的所有实例之间共享。

在一个函数中,它仍然是一个持久variables,所以你可以计算一个函数被调用的次数。

当在函数或类之外使用时,它确保该variables只能被该特定文件中的代码使用,而不能在其他地方使用。

然而,常量variables不能改变。 常量和静态常用于类的定义中,以提供某种常量。

 class myClass { public: static const int TOTAL_NUMBER = 5; // some public stuff private: // some stuff }; 

静态意味着编译单元(即单一的C ++源代码文件)是局部的,换句话说,这意味着它不会被添加到全局名称空间中。 您可以在不同的c ++源代码文件中使用相同的名称和名称冲突的多个静态variables。

const只是常量,意思是不能修改的。

一个静态variables只能获得一个初始值。 这意味着如果在示例函数中有诸如“ static int a=0 ”之类的代码,并且此代码在该函数的第一次调用中执行,但在函数的后续调用中不执行; variables(a)仍然有其当前值(例如,当前值为5),因为静态variables只获得一次初始值。

一个常量variables的值在整个代码中是不变的。 例如,如果将常量variables设置为“ const int a=5 ”,那么“a”的这个值在整个程序中将保持不变。

const等同于#define但仅用于值语句(例如#define myvalue = 2 )。 声明的值将在编译之前replacevariables的名称。

static是一个variables。 值可以改变,但是即使variables是在函数中声明的,variables也会在程序执行过程中持续存在 。 它相当于一个全局variables,它的用法范围是它们声明的块的范围,但是它们的范围是全局的。

因此,静态variables只能被初始化一次 。 如果variables是在一个函数中声明的,这是特别重要的,因为它保证了初始化只会在第一次调用函数的时候发生

静态的另一个用法涉及对象。 在一个对象中声明静态variables的效果是,该值对于该对象的所有实例都是相同的。 因此,它不能用对象的名字来调用,而只能用类的名字来调用。

 public class Test { public static int test; } Test myTestObject=new Test(); myTestObject.test=2;//ERROR Test.test=2;//Correct 

在像C和C ++这样的语言中,声明静态全局variables是没有意义的,但是它们在函数和类中非常有用。 在托pipe语言中,具有全局variables效果的唯一方法是将其声明为静态。

静态variables在一个types的所有实例中是通用的。

常量variables是特定于每个单独实例的types,但是它们的值在编译时是已知的并且是固定的,并且在运行时不能更改。

与常量不同,静态variables值可以在运行时更改。

const表示常量,它们的值是在编译时定义的,而不是在运行时显式地改变它,常量的值在运行时不能改变

不过,静态variables是可以在运行时初始化和更改的variables。 但是,静态variables不同于静态variables为整个程序保留其值的意义,即它们的生命周期是程序的寿命,或者直到程序使用dynamic分配方法来分配内存。 但是,即使它们在程序的整个生命周期中保留了它们的值,但它们在它们所在的代码块之外是不可访问的

有关静态variables的更多信息,请参阅此处

常量不能改变。 静态variables对于文件是私有的,只能在程序代码中访问,而不能在其他人中访问。

static关键字定义了variables的范围,而const关键字定义了程序执行过程中不能改变的variables的值

简单和简短的答案是内存分配给静态和常量只有一次。 但是在常量中,只有一个值,静态值可能会改变,但是在程序结束之前内存区保持不变。

静态值可能存在一个函数中,可以以不同的forms使用,在程序中可以有不同的值。 在整个程序中,在递减递减之后,它们的值也可以改变,但是常量是常量。