我对类中的静态和静态const变量有疑问。
特别好奇静态和静态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;
}
为什么'static int testStatic'需要使用定义,如果没有,我得到关于testStatic的'未定义引用'?
这个定义是否与testStatic建立了联系?
那么testConstStatic呢?
提前致谢!
已更新!
这个问题的主要原因是,当我将静态变量声明为全局且肯定未定义并打印输出时,没有关于'未定义引用'的消息但是对于CLASS中的静态变量没有definitino它会显示消息'undefined reference'< / p>
#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;
}
谢谢!
答案 0 :(得分:4)
必须在使用前定义C ++中的所有变量。此定义的发生方式取决于变量的类型。
static
类成员变量,该定义可能由类的构造函数(它本身可能是隐含的)隐式执行。static
变量根据定义不是由构造函数初始化的,因此static
成员变量必须始终具有明确的定义。static const
成员的定义与其声明结合起来,就像您所做的那样,under certain circumstances。从概念上讲,static const int testConstStatic = 1;
做了两件不同的事情:声明testConstStatic
成员,和将其定义为值1
。无论出于何种原因,语言设计人员都不会选择将这两个步骤合并为非const
static
成员。顺便说一句(为了解决Ed Heal的评论),必须定义非static
const
成员(与任何非static
成员变量一样)在建造物体;构造完成后它不会改变,但是对于每个类的实例,它可能具有不同的值,这与static const
成员不同,{{1}}成员在程序的整个持续时间内始终只有一个值。 / p>
答案 1 :(得分:3)
static const int
成员是一个特例。在大多数用法中,它们被视为编译时常量,因此不需要它们的存储位置。唯一的例外是当您尝试创建指向此变量的指针或引用时,它需要一个可以存在的位置,并且您需要提供定义。
答案 2 :(得分:0)
静态成员变量需要在类外定义。这是一条规则。
C ++ 11以后,const静态成员通常不必在课堂外定义。
静态数据成员被视为在对象实例之间共享的全局变量,因此它们只能被定义一次,并且安全下注在类之外。
答案 3 :(得分:-1)
const变量按定义是静态的。因此static
中的static const
是多余的。即只需const
即可。
static
需要static int
,因为没有它,变量是一个普通的非静态成员变量,只为实例定义。