【问题标题】:In C++, do access specifiers not control visibility of static members?在 C++ 中,访问说明符不控制静态成员的可见性吗?
【发布时间】:2012-02-20 07:16:37
【问题描述】:

来自http://www.learncpp.com/cpp-tutorial/812-static-member-functions/的代码示例:

class Something
{
private:
    static int s_nValue;
};

int Something::s_nValue = 1;

此代码编译时不会出现警告或错误。我不明白为什么。

我们不应该因为尝试访问s_nValue 而收到警告,因为它是私有的吗?还是这些访问说明符不适用于静态成员?

【问题讨论】:

    标签: c++ class static


    【解决方案1】:

    s_nValue 的定义不是从类外部“访问”成员——它实际上是它的实现。如果将其放置在源文件中的封闭类声明之外,则可以将其视为就像成员函数的实际实现一样。

    换句话说,访问说明符绝对同样适用于静态成员。

    【讨论】:

      【解决方案2】:

      这是类的private 静态成员的定义,因此是允许的。因为类的静态成员的定义必须在类外,不管是private还是public

      简而言之,它不是访问成员,而是定义它,就像你定义private类外的函数.

      【讨论】:

        【解决方案3】:

        另请注意:不要混淆分配和构造函数。行:

        int Something::s_nValue = 1;
        

        不是“分配”一个值,而是构造对象。一般来说:

        ClassA Something::s_nValue(...parameters...);
        

        C++ 允许构造函数的“赋值”样式语法。示例:

        class A
        {
        public: 
            A(int i) { m_i = i; }
        
            int getI() { return m_i; }
        
        private:
            int m_i;
        };
        
        class B
        {
        public: 
            static int getAI() { return a.getI(); }
        private:
            static A a;
        };
        
        A B::a = 2;
        

        【讨论】:

          猜你喜欢
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-30
          • 1970-01-01
          • 2010-10-25
          • 2011-02-15
          相关资源
          最近更新 更多