访问类外的私有静态变量

时间:2016-11-16 13:26:52

标签: c++

我一直在做C ++,我已经在类中声明了一个静态变量作为私有,我知道静态变量独立于对象并在对象之间共享。如果我尝试打印静态使用类名在类外的变量我得到编译错误是因为变量是私有的?我确实读过静态变量只能通过类名和范围解析运算符来访问。

#include <iostream>

using namespace std;

class Sample{

    int val;
   static int value;
    public:


        Sample(int in);
        Sample();
        void setval(int in){

            val = in;
        }

        void printval ()const{

            cout << val<<endl;
        }

};

Sample::Sample(int in){

    val = in;
}

Sample::Sample(){

    val = 0;
}

int Sample::value = 34;
int main()
{

   const Sample obj(1);
   Sample obj2;

   obj2.printval();

   obj.printval();

  cout <<"static value = " << Sample::value;

   return 0;
}

错误

main.cpp:37:5: error: 'int Sample::value' is private                                                                                                                                                  
 int Sample::value = 34;                                                                                                                                                                              
     ^                                                                                                                                                                                                
main.cpp:49:39: error: within this context                                                                                                                                                            
   cout <<"static value = " << Sample::value; 

2 个答案:

答案 0 :(得分:3)

  

据我所知,静态变量独立于对象并在对象之间共享

这是正确的。但是,跨对象实例共享变量并使变量可访问是相互独立的。 (共享,可访问)对有四种组合。所有四个都可供您使用:

  • public static变量在类
  • 之外共享和访问
  • private static变量是共享的,但在类
  • 之外无法访问
  • public非静态变量不是共享的,但可以在类
  • 之外访问
  • private非静态变量在类
  • 之外既不共享也不可访问

请注意,处理私有静态value的方式可以在您使用非静态val的方式之后建模,即通过为您的类用户提供一些公共成员函数来处理静态变量:

class Sample {
...
public:
    static int getvalue() { return value; }
};

现在您可以像这样打印:

cout << "static value = " << Sample::getvalue();

答案 1 :(得分:1)

私人班级成员和方法只能由班级成员和方法访问。无论类成员是否为静态,都是如此。这对班级成员的可访问性没有影响。

请注意,公共类方法可以访问私有类成员,就像任何其他方法一样,这并不妨碍公共类方法返回指针或对私有类成员的引用。这是您的唯一选择。