C++ 私有静态类成员

C++ 私有静态类成员,c++,C++,当我们声明一个成员变量static时,它在类的所有实例之间共享。我听说您应该考虑属于类本身的变量,而不是任何实例。这使我们可以在不实例化类的任何对象的情况下初始化变量,这是有意义的 class Something { public: static int s_nValue; }; int Something::s_nValue = 1; 但是为什么我们可以初始化私有静态成员呢 class Something { private: static int s_nVa

当我们声明一个成员变量static时,它在类的所有实例之间共享。我听说您应该考虑属于类本身的变量,而不是任何实例。这使我们可以在不实例化类的任何对象的情况下初始化变量,这是有意义的

class Something
{
  public:
    static int s_nValue;
};

int Something::s_nValue = 1;
但是为什么我们可以初始化私有静态成员呢

class Something
{
   private:
      static int s_nValue;
};

int Something::s_nValue = 1;

当我们谈论静态成员时,private是否意味着什么?

是的,它确实意味着什么。考虑下面的示例,它会引发编译器错误,因为成员是“代码>私有< /代码>。能够初始化私有变量与能够从任何上下文中更改它是不同的

class Something
{
  private:
    static int s_nValue;
};

int Something::s_nValue = 1;

int main(){
    Something::s_nValue = 2; // Compiler error here.
}

Public、private和protected是类的属性,而不是对象的属性。它们的目的是让您指定该类的哪些部分对其他类可见,而不是对同一类的对象隐藏内容。因此,您可以编写如下代码:

class A
{
public:
bool operator<(const A& other)
{
return this->val < other.val;
}
private:
int val;
};
A类
{
公众:
布尔运算符val

因此,private即使应用于静态成员也有意义——它只是说其他类看不到该成员。

private仍然意味着同样的事情:除了在
某物的成员(或朋友,或
某物中的嵌套类)的定义中,您不能使用名称
某物::s_nValue

某物的成员的定义,即,该静态成员
s\n值

int Something::another_static_val = s_nValue;  // also okay
int OtherClass::x = Something::s_nValue;       // Illegal access!

int Something::getValue() const {
    return s_nValue;                // okay, getValue is a member of same class
}

int regularFunction() {
    return Something::s_nValue;     // Illegal access!
}
当我们谈论静态成员时,private是否意味着什么

我将尝试用一个经典的例子来回答。考虑下面的代码:

#include <iostream>

class foo {
  static int count;
  int id;
public:
  foo() : id(++count) {}
  int getid() const { return id; }
};

int foo::count = 0;

int main() {
  foo f1, f2, f3;

  std::cout << f1.getid() << std::endl;
  std::cout << f2.getid() << std::endl;
  std::cout << f3.getid() << std::endl;
}
#包括
福班{
静态整数计数;
int-id;
公众:
foo():id(++count){}
int getid()常量{return id;}
};
int foo::count=0;
int main(){
富一代、富二代、富三代;

std::你能用这种方式初始化私有静态成员吗?因为这是语言定义私有静态成员的方式。如果你使用c++11,你可以对静态、常量和整型的类型使用内联成员初始化。@snowandotherjoys,或
constexpr
文本类型,但请注意它仍然不是定义;如果它是ODR-used,您仍然需要它的定义让我更清楚。我想这只是事实,我们可以设置一个私人类成员在它的花括号之外,这不适合我。谢谢!除了不允许在主函数中更改它之外,我们也不允许阅读它,对吗?
#include <iostream>

class foo {
  static int count;
  int id;
public:
  foo() : id(++count) {}
  int getid() const { return id; }
};

int foo::count = 0;

int main() {
  foo f1, f2, f3;

  std::cout << f1.getid() << std::endl;
  std::cout << f2.getid() << std::endl;
  std::cout << f3.getid() << std::endl;
}