【问题标题】:Static member in class类中的静态成员
【发布时间】:2014-04-11 02:51:28
【问题描述】:

我对类中的静态和静态 const 变量有疑问。

特别好奇关于static和static const的内存状态。

在下面的代码中,

#include <iostream>
using namespace std;

class test{
public:
    static const int testConstStatic =1;
    static int testStatic;
};

int test::testStatic = 0;

int main(){

  cout << test::testStatic << endl;
  cout << test::testConstStatic << endl;
  return 0;
}

为什么需要使用“静态 int testStatic”定义,如果不需要,我得到关于 testStatic 的“未定义参考”?

这个定义是否与 testStatic 建立联系?

那么 testConstStatic 呢?

提前致谢!

已更新!!

这个问题的主要原因是,当我将静态变量声明为肯定没有定义的全局变量并打印输出时,没有关于“未定义引用”的消息,但是对于没有定义的 CLASS 中的静态变量,它显示消息“未定义引用”

#include <iostream>
using namespace std;

static int testStaticInGlobal;

class test{
public:
        static int testStatic;
};

int test::testStatic = 0;

int main(){

      cout << test::testStatic << endl;  // 'Undefined reference' error without definition
      cout << testStaticInGlobal << endl; // no error without definition

      return 0;
}

谢谢!

【问题讨论】:

  • 什么是static const?只需const 就足够了
  • @EdHeal +1 到评论,还有例外情况。前任。一个 DefaultValue 常量(例如 static const char[]),将 按地址 与成员进行比较,以确定是否在执行永不为空的ptr 策略时对其进行动态释放。诚然很少见,但确实发生了,除此之外,我完全同意你的看法,尤其是在似乎是 OP 的情况下。 (尽管现在我想到了我,我看到的每个示例都通过强制转换 const 来打破所有规则)。
  • 随着你的更新,static int testStaticInGlobal; 是一个定义,而static int testStatic; 不是因为它在一个类中。
  • @chris 好吧,看起来是这样,但只是因为它在课堂上?
  • @HwanghoKim,是的,这就是它的要点。我认为这与这样一个事实有关,即如果它是一个定义,那么您很容易遇到多个定义。

标签: c++ static


【解决方案1】:

所有 C++ 中的变量必须在使用前定义。这个定义如何发生取决于变量的类型。

  • 对于非static 类成员变量,定义可能由类的构造函数隐式执行(其本身可能是隐式的)。
  • 由于static 变量根据定义不会由构造函数初始化,因此static 成员变量必须始终具有显式定义。
  • 为方便起见,C++ 允许将static const 成员的定义与其声明结合起来,正如您所做的那样,under certain circumstances。从概念上讲,static const int testConstStatic = 1; 做了两件不同的事情:声明testConstStatic 成员,将其定义为具有1 的值。无论出于何种原因,语言设计者都没有选择允许为非conststatic 成员组合这两个步骤。

顺便说一下(针对Ed Heal 的评论),必须在构造对象时定义非static const 成员(与任何非static 成员变量一样);构造完成后它不会改变,但对于类的每个实例它可能具有不同的值,这与 static const 成员不同,它在整个程序期间始终只有一个值。

【讨论】:

  • 请参阅this answer 以获取有关第三点的说明。它并不总是有效。
  • 好点,@chris;感谢您的澄清。答案已更新。
  • 很好,但从技术上讲,它仍然不是一个定义,只是一个初始化。该定义仅在外部,通常在一个 .cpp 中,以免有多个定义,因为多个翻译单元包含该标头。
  • @CarLuva 第二点,你提到静态需要明确定义,那么static int testStaticInGlobal;呢?是否包含明确的定义?
【解决方案2】:

static const int 成员是一个特例。在大多数情况下,它们被视为编译时常量,因此不需要它们的存储位置。唯一的例外是当您尝试创建一个指向此变量的指针或引用时,它需要一个可以存放的地方并且您需要提供一个定义。

【讨论】:

  • @Mark Ransom 对,当我打印出'static const'的地址时,它会显示'undefined reference'
【解决方案3】:

静态成员变量需要在类外定义。这是规矩。

从 C++11 开始,const 静态成员通常不必在类外定义。

静态数据成员被视为在对象实例之间共享的全局变量,因此它们只需要定义一次,并且安全的赌注在类之外。

【讨论】:

  • 只是规则?有什么解释吗?
  • @HwanghoKim,它需要一个定义(如声明与定义)。它目前没有。
【解决方案4】:

const 变量根据定义是静态的。所以static const 中的static 是多余的。即只需 const 即可。

staticstatic int 所必需的,因为没有它,该变量是一个普通的非静态成员变量,仅为实例定义。

【讨论】:

  • 这不是真的。每个实例都有一个不同的const 成员是非常好的。
  • @chris 评论的跟进,这样的非静态成员也需要初始化。
  • @WhozCraig - 通过初始化列表是这样做的唯一方法
  • @Ed yuppers,与参考成员(const 或其他)有共同之处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 2011-03-31
相关资源
最近更新 更多