C ++中的静态const是否与C中的const相同?

时间:2014-04-01 12:36:13

标签: c++ c static const

在C头文件中:

const int AvarInC = 1;

现在在C ++文件中:

class Cpp
{
   public:

   static const int PublicAvar = 1;

   private:

   static const int Avar = 1;
};

虽然我有: const int AvarInC = 1;在我的C标题中 要么 static const int AvarInC = 1;在我的C标题中。

会是同一件事吗?第一个没有关键字static,隐式静态吗?

4 个答案:

答案 0 :(得分:2)

类似。当然,您也可以在C ++中使用C语言。

但是特定的C ++方式(类成员)在可见性和范围方面也有所不同。只有属于Cpp类(或朋友)的代码才能访问AvarPublicAvar介于两者之间;任何人都可以访问它,但他们需要将其称为Cpp.PublicAvar

关键字static在C ++中有两个不同的含义。有时它意味着存储类(如您的示例中所示) - 也就是说,“这不是每个实例的成员”。在这方面,一个完全不属于类成员的变量显然是静态的,而不必声明它。

其他时候,static可能会引用链接时可见性。静态符号仅在其自己的编译单元内有效。那是原来的C意思。它没有进入您的示例,特别是因为我们假设您的代码进入头文件,因此存在于多个编译单元中。将非成员变量标记为static将导致程序中的变量的多个副本(每个编译单元一个),这对于const变量不会有任何影响,但通常会导致非常令人困惑的程序行为。

答案 1 :(得分:1)

如果我理解正确,那么他们就不一样了。由于您将C语言放在头文件中,我假设它将是一个全局常量,因此实际上只有一个副本。它不会每次都需要重新创建(因为static会做什么。

但是,C ++文件中的那个是在一个类中并且是静态的,所以每次将该类实例化为一个对象时,所有实例都将共享PublicAvar变量的相同副本,并且它不会用每个对象重新创建。

尽管如此,我有一种感觉,你知道static做了什么。从技术上讲,不,他们不做同样的事情并且不是同样的事情......但他们的行为也是如此。

我不是专家,所以我错了,但我相信这是对的。希望它有所帮助。

答案 2 :(得分:-1)

“同样”是相当含糊的。两者都将被视为编译时常量。您可以(应该)不在运行时更改它们,编译器可以决定使用此信息来优化您的代码。

答案 3 :(得分:-1)

不,他们不是same。它们都是在编译时初始化的变量。但是,static变量可以在不创建object的任何class的情况下访问,但non static变量仅存在于对象中。即,static变量在内存中为为其创建的任意数量的对象占用公共空间,但在另一个对象的情况下则不行。