C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <IOSTREAM.H>
class Point { public: void output() { } static void init() { } }; void main() { /* Point pt;*/ // pt.init(); // pt.output(); Point::init(); Point::output(); } |
Point::out illegal call of non-static member function
非法调用非静态成员函数Point::output
加上static表明该函数是一个静态函数,静态成员函数和静态成员属于类本身,在类加载的时候,即为他们分配了空间,
所以可以通过类名::函数名或类名::变量名来访问,而非静态成员函数和非静态成员属于对象的方法和数据,也就是应该先产生类的对象,然后才能通过类的对象去引用。
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <IOSTREAM.H>
class Point { public: void output() { } static void init() { x = 0; y = 0; } private: int x, y; }; void main() { /* Point pt;*/ // pt.init(); // pt.output(); Point::init(); // Point::output(); } |
illegal reference to data member 'Point::x' in a static member function
在静态成员中非法引用Point对象的x和y数据成员,init是一个静态函数,不属于某个具体的对象,也就是说还没有产生Point类的任一个具体对象时,该函数就就已经存在于程序的代码区了。但这时,Point类的成数据成员x和y还没有分配内存空间,这样,在init函数中对他们进行赋值操作怎么会成功呢,也就是说,
在静态成员函数中是不能调用非静态成员的,包括非静态成员函数和非静态成员变量
静态成员函数属于类本身,在类的对象产生之前就应该存在了,所以在非静态成员函数中是可以调用
实际上,关于函数之间的引用许可,可以在内存模型这一角度来考虑,也就是说,无论采用什么样的操作,程序代码都是在内存中运行的,只有在内存中占有了一席之地,我们才能够访问它,如果一个成员函数或成员变量还未在内存中产生,结果是无法访问它的。
静态成员函数只能访问静态成员变量。