Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我们需要定义一个类的静态变量,而不是类的其他成员?_C++_Oop - Fatal编程技术网

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;