先看这样一段代码,其中的静态成员函数可以被直接通过类调用,但是非静态成员函数不可以,只能实例化对象后才能调用。这是为什么呢?
#include <iostream>
using namespace std;
class A {
private:
int a;
public:
void func (int a) {
this->a = a;
}
int retA () {
return a;
}
static void staticFunc () {
cout << "this is static func" << endl;
//this->a = 1;
}
void staticFunc (int i) {
cout << "this is a unStatic func" << endl;
}
};
int main ()
{
/*
A a;
a.func (3);
cout << a.retA () << endl;
*/
A::staticFunc();
//A::staticFunc(1);
return 0;
}
我们先不急着回答这个问题,先思考C++内存的结构
C++内存大体上分为4个部分:
1.全局数据区:存放全局变量、静态变量、常量
2.代码区:成员函数和非成员函数
3.栈区:参数局部变量、函数参数、返回数据、返回地址
4.堆区:用户自行申请区间
那么成员函数就存储在代码区,这里可以看出二者在内存上并没有显著的区别,那么问题就出在非静态成员函数的this指针上,这个指针是指向对象自身的指针,将类的内存强制转化后的产物,也就是说必须将类实例化,其中的成员变量都赋值才能使用this指针。但是静态成员函数却完全不一样,他们没有this指针,在代码中就可以看到,当在静态成员函数中使用this指针会报错提示说静态成员函数没有this指针。
在内存中看,静态函数在声明时运行时就已经给分配了内存,故而可以直接调用,但是非静态的却是在创建实例时就才分配内存。