C++ 从标头中删除静态成员

C++ 从标头中删除静态成员,c++,C++,类的静态成员变量和类的“主体”中定义的“自由”变量之间有什么区别?我的意思是我可以用第二个代替第一个来释放类的标题吗 // b.h class B { public: B(int j); void print(); private: static int is; }; //b.cpp #include <iostream> int i = 0; int B::is = 0; B::B(int j) { i = j; is = j; } void B::p

类的静态成员变量和类的“主体”中定义的“自由”变量之间有什么区别?我的意思是我可以用第二个代替第一个来释放类的标题吗

// b.h
class B
{
public:
  B(int j);
  void print();
private:
  static int is;
};


//b.cpp
#include <iostream>

int i = 0;
int B::is = 0;

B::B(int j)
{
  i = j;
  is = j;
}

void B::print(){
  std::cout << i << " " << is << " " << std::endl;
}

//main.cpp
int main() {
  B b1(1);
  b1.print();
  B b2(2);
  b2.print();
  b1.print();
  return 0;
}

在您的例子中,区别在于静态成员数据只能由类访问,正如在类的
private
部分中声明的那样,这在某些情况下可能是可取的。任何人都可以更改全局
i

因此,如果一个变量只用于类,其他人不应该使用它,那么在
private
部分使用静态成员数据是一个更好的解决方案。它允许您限制对变量的访问。全局变量通常是不好的,因为它允许任何人不受限制地访问

请注意,在您的示例中,全局变量
i
具有外部链接。在其他文件中,可以简单地声明为
extern int i
,然后可以使用
i
并对其进行修改


即使将其设置为
静态
全局变量,以使其具有内部链接,但与
静态
成员数据相比,它并不好,因为静态成员数据让您了解到变量仅由类使用,而不是由非类成员(如果在同一文件中存在)使用。因此,与全局
静态
数据相比,成员数据增加了可读性。

它的文件范围为b.cpp,谁可以更改它以及如何更改?@DmitryKachko:从其他文件中,可以使用全局变量,就像在您的情况下它具有
外部
链接一样。在其他文件中,您可以简单地声明为
extern int i
,然后可以使用(和修改)变量。全局变量因名称空间冲突而无效,当然,我可以把它放在一个名称空间中,这只是一个简单的例子,这不是问题所在。我问的问题是——我的类使用的静态变量不是它接口的一部分,它们只是一种助手,代码的读者并不关心类使用了哪些帮助变量。未命名名称空间中的变量具有外部链接。但是您可以这样做,因为即使变量具有外部链接,也没有其他文件可以从difference
.cpp
文件中定义的未命名名称空间访问变量。但正如我所说,它仍然是名称空间级别的变量,并且与类无关,即使类正在使用该变量。如果只有类在使用它,那么我仍然认为
static
member比在未命名的命名空间中定义它们要好得多。
1 1 
2 2 
2 2