C++ 为什么我们需要定义一个类的静态变量,而不是类的其他成员?
每当我们有一个带有静态成员变量的类时,为什么我们需要定义它 为什么我们不能直接使用它 我想看看如果我没有定义静态变量,是否会为它分配内存空间,所以我写了这个小代码,看起来内存确实是为变量分配的C++ 为什么我们需要定义一个类的静态变量,而不是类的其他成员?,c++,oop,C++,Oop,每当我们有一个带有静态成员变量的类时,为什么我们需要定义它 为什么我们不能直接使用它 我想看看如果我没有定义静态变量,是否会为它分配内存空间,所以我写了这个小代码,看起来内存确实是为变量分配的 #include <iostream> using namespace std; class A { public: int a; static int b; }; // int A::b = 1; int main() { cout<<sizeo
#include <iostream>
using namespace std;
class A
{
public:
int a;
static int b;
};
// int A::b = 1;
int main()
{
cout<<sizeof(A::b);
return 0;
}
现在,我定义了变量并对其进行了初始化(取消了int A::b=1;行的注释)并运行了相同的代码,即使这次的输出是相同的
那么,定义它的目的是什么呢?如果变量是,那么定义是必需的,而
sizeof(A::b)
则不是
在整个程序(包括任何标准库和用户定义库)中,每个非内联函数或变量(见下文)都需要一个且只有一个定义。编译器不需要诊断此冲突,但违反此冲突的程序的行为尚未定义
例如,若您获取变量的地址,那个么将使用odr,并且必须对其进行定义
cout << &A::b;
cout对于静态数据成员,您必须在实现中为其分配内存,您现在所做的不是分配内存,而是获取int
的大小。
在C++ 17中,可以声明静态变量内联,对于 int ,它的默认值为0,但可以设置任何所需的值。像这样:
static inline int b=4;
sizeof(A::b)
不会告诉您是否为变量分配了内存。它只是告诉你一个int
的大小。毕竟,你可以做cout那么,我们做定义是为了给它一个真正的内存空间,对吗?类的其他成员(我假设你是指非静态数据)存在于你创建的每个对象中。然而,在整个程序中只有一个静态数据成员,即使您从未创建过n个实例。那么它应该放在哪里呢?命名空间范围中的定义就是答案。
static inline int b=4;