2016-11-16 146 views
1

我在做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

'是这是因为变量是私人的'是的,并且错误消息告诉你到底是什么。变量是静态的事实并不改变它仍然是私有的事实。 – SingerOfTheFall

+1

如果你不希望变量为'private',为什么你将它声明为'private'? –

+2

这是私人的手段 - 它不允许在课堂以外使用。 参见:http://stackoverflow.com/questions/860339/difference-between-private-public-and-protected-inheritance – woockashek

回答

2

据我知道静态变量是独立的对象和共享跨越对象

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

  • public static变量是共享的,类
  • private static变量是共享的外部访问,但是类
  • public非静态变量是不共享的外部访问,但访问类的外部
  • private非静态变量既不共享,也不是类外部接近

请注意,您应对私有静态value方式可你非静态val,通过给类用户的一些公共成员函数,即工作方式与静态变量的工作之后进行建模:

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

现在你可以这样打印:

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

使用的现有printval()方法来印出静态变量。 –

+0

@SanthoshPai也可以。非静态成员函数可以访问静态成员变量以及非静态成员变量。 – dasblinkenlight

1

私有类成员和方法仅由类的成员和方法访问。无论类成员是否为静态,这都是事实。这对类成员的可访问性没有影响。

需要注意的是一个公共类方法可以访问私有类成员,就像任何其他的方法,而这并没有返回一个指针或私有类成员参考排除公共类方法。这是你的一个选择。