静态成员函数可以通过对象调用么?我的书本说不能.但是编译器可以调用..vc6.0 和vs2008

如题所述

好像不可以!
外部访问类的静态成员只能通过类名来访问。

静态成员函数无法访问属于具体类对象的非静态数据成员,也无法访问非静态成员函数,他只能访问静态数据成员和调用其余的静态成员函数。这样一来,就能防止类的非静态数据成员遭受窜改。静态成员函数没有this指针,任何在静态成员函数中显式或隐式地引用这个指针都将导致编译时刻错误。追问

我试过了可以....书上说的不对.你试试吧 我vs2008和vc 6.0都可以..........我不知道什么原因导致有两种说法

追答

你的测试代码贴上来。我学习一下,我对这里也比较迷糊、谢谢!

追问

#include
using namespace std;
class Sample
{
int a;

public:
Sample(int x)
{
a=x;
}
static void disp(Sample s)
{
cout<<s.a;
}
static int b;
};
int Sample::b=199;
void main()
{
Sample pt(3),g(4);
cout<<pt.b;
pt.disp(g);
Sample::disp(g);

}

追答

我试了一下也是可以的。我也迷糊了。如果说初始化静态成员只允许使用类名,这个到还可以理解。但是外部访问类的静态成员只能通过类名来访问。这个外部什么意思?我也不懂了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-09
c++ primer第四版399面说,可以通过作用域操作符从类直接调用static成员,或者通过对象、引用或指向该类类型对象的指针间接调用。因此回答是完全可以。
static数据成员必须在类定义体外定义,不能通过构造函数初始化,因此static型的变量b在外面定义;静态成员函数不能直接使用非static成员,但不意味着不能访问,static void disp(Sample s)中通过传递进去的Sample类对象s来访问s的数据成员a是合理的;
所以上述编译无任何错误本回答被提问者采纳
相似回答