在类外访问私有静态变量

San*_*Pai 2 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;
}
Run Code Online (Sandbox Code Playgroud)

错误

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; 
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

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

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

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

请注意,您处理私有静态value的方式可以按照您使用 non-static 的方式进行建模val,即通过为您的类用户提供一些公共成员函数来处理静态变量:

class Sample {
...
public:
    static int getvalue() { return value; }
};
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样打印它:

cout << "static value = " << Sample::getvalue();
Run Code Online (Sandbox Code Playgroud)