【问题标题】:Private static class members私有静态类成员
【发布时间】:2014-09-02 15:27:33
【问题描述】:

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

class Something
{
  public:
    static int s_nValue;
};

int Something::s_nValue = 1;

但是为什么我们可以初始化私有静态成员呢?

class Something
{
   private:
      static int s_nValue;
};

int Something::s_nValue = 1;

当我们谈论静态成员时,私有甚至意味着什么?

【问题讨论】:

  • 您可以通过这种方式初始化私有静态成员,因为语言就是这样定义私有静态成员的。如果您使用的是 c++11,则可以对静态、常量和整型类型使用内联成员初始化。
  • @snowandotherjoys,或constexpr 文字类型,但请注意,它仍然不是定义;如果它是 ODR 使用的,你仍然需要一个定义。

标签: c++


【解决方案1】:

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

class Something
{
  private:
    static int s_nValue;
};

int Something::s_nValue = 1;

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

【讨论】:

  • 而且除了不能在你的主函数中修改之外,我们也不能读取它,对吧?
【解决方案2】:

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

class A
{
public:
bool operator<(const A& other)
{
return this->val < other.val;
}
private:
int val;
};

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

【讨论】:

    【解决方案3】:

    私有仍然意味着同样的事情:您不能使用名称 Something::s_nValue,除非在 Something 的成员(或朋友,或 Something 中的嵌套类)的定义中。

    int Something::s_nValue = 1;
    

    Something的成员的定义——即那个静态成员s_nValue

    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!
    }
    

    【讨论】:

    • 行“int OtherClass::x = Something::s_nValue;”让我更清楚。我认为这只是我们可以在花括号之外设置一个私有类成员的事实,这不适合我。谢谢!
    【解决方案4】:

    当我们谈论静态成员时,私有甚至意味着什么?

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

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

    LIVE DEMO

    在上面的示例中,我们使用私有 static int 来计算创建的 foo 实例。我们创建了 count static 成员变量 private ,因为我们不希望除了 foo 类型的对象之外的任何其他人都弄乱它。

    这只是一个幼稚的例子,想想可能性。

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      相关资源
      最近更新 更多