从标头中删除静态成员

时间:2012-03-13 18:07:33

标签: c++

类的静态成员变量和类的“body”中定义的“free”变量之间的区别是什么?我的意思是我可以使用第二个代替第一个来排出班级的标题吗?

// 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;
}

输出:

1 1 
2 2 
2 2 

1 个答案:

答案 0 :(得分:2)

在您的情况下,区别在于静态成员数据只能由类访问,因为它在类的private部分中声明,这在某些情况下可能是合乎需要的。任何人都可以更改全局i

因此,如果变量仅适用于该类,并且不应由其他人使用,那么在private部分中使用静态成员数据是更好的解决方案。它为您提供对变量的受限访问权限。全局变量通常很糟糕,因为它可以不受限制地访问任何人。

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

即使你使它成为static全局变量,要使它具有内部链接,与static成员数据相比它也不好,因为静态成员数据给你一些想法,变量仅由类使用,而不是由非类成员(如果在同一文件中)。因此,与全局static数据相比,static成员数据提高了可读性。