【问题标题】:is static const in C++ same as const in C? [duplicate]C++ 中的 static const 与 C 中的 const 相同吗? [复制]
【发布时间】:2014-05-12 05:43:36
【问题描述】:

在C头文件中:

const int AvarInC = 1;

现在在 C++ 文件中:

class Cpp
{
   public:

   static const int PublicAvar = 1;

   private:

   static const int Avar = 1;
};

虽然我有: 常量 int AvarInC = 1;在我的 C 头文件中 要么 静态常量 int AvarInC = 1;在我的 C 头文件中。

会是一样的吗?第一个没有关键字静态的,隐式静态的吗?

【问题讨论】:

  • 无法从Cpp 的范围之外访问变量AvarPublicAvar 可以作为Cpp::PublicAvar 从任何地方访问。
  • 感谢巴特·范尼罗普。您对 PublicAvar 的看法是正确的。但我认为我们应该将所有变量都放在私有范围内。所以我问了。
  • 顺便说一句,class Cpp 让我颤抖。我希望这是一个人为的例子,而不是你模仿 Java 的方式,试图将你的 main() 放在一个类中......
  • 这是一个模棱两可的问题。很难回答。

标签: c++ c static constants


【解决方案1】:

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

【讨论】:

  • 我认为这是我第一次遇到常量的术语“编译时变量”。这在某种程度上肯定是正确的,但是……很奇怪。不过,这不是我的反对意见。
  • 将其更改为“编译时常量”。它应该表明编译器知道常量的值。与 const int a = foo(); (和 foo 读取文件)相反,其中值在编译时未知。
【解决方案2】:

类似。当然,你也可以在 C++ 中使用 C 方式。

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

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

其他时候,static 可能指的是链接时可见性。静态符号仅在其自己的编译单元内有效。这就是原来的C意思。它没有出现在您的示例中,特别是因为我们假设您的代码位于头文件中,因此存在于多个编译单元中。将非成员变量标记为 static 将导致程序中的变量副本数(每个编译单元一个),这对 const 变量不会造成伤害,但通常会导致非常混乱的程序行为.

【讨论】:

  • 虽然我有: const int AvarInC = 1;或 static const int AvarInC = 1;在我的 C 头文件中。会是一样的吗?第一个没有关键字静态的,隐式静态的吗?
  • @learningfellow:请阅读链接的可能重复项。不,static 绝不是隐含的,在 C 标头中包含 static 变量几乎肯定不是您想要的。
  • 试图扩大答案以更好地覆盖最后两个 cmets
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如果我理解正确,不,它们并不完全相同。由于您将 C 放在头文件中,我假设它将是一个全局常量,因此无论如何实际上只会有一个副本。它不需要每次都重新创建(因为 static 会这样做。

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

    不过,我感觉你知道static 做了什么。所以从技术上讲,不,他们做的不是同一件事,也不是同一件事……但他们的行为确实相似。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2023-03-30
      • 2021-09-22
      相关资源
      最近更新 更多