首先呢我们知道c++类中的成员分为成员变量和成员函数两大类,如果再加上static给以区分的话那么会有以下四种:静态成员变量,非静态成员变量;静态成员函数,非静态成员函数 (1)成员变量 我们知道类的静态成员变量是属于整个类的,而不是属于某一个对象的(不可能据为某个可恶的对象自己拥有,因为这是大家的),静态成员变量在内存中只存在一份供各个类的实例使用。而非静态成员变量在创建对象时都会创建属于当前创建对象的一份,这是属于这个对象自己的一份。 静态成员变量一般在类的外部进行定义形式为: StaticClassName MainClassName:: staticMemberName =value; 简单验证代码: #include <iostream> using namespace std; class MyClass { public: MyClass(){ this->non_static_member=10;} static int static_member; int non_static_member; }; int MyClass::static_member=5; int main() { MyClass first,second; //我们输出MyClass定义的两个对象的静态成员变量的内存地址看是否一样 cout<<&(first.static_member)<<" "<<&(second.static_member)<<endl; //我们输出MyClass定义的两个对象的非静态成员变量的内存地址看是否一样 cout<<&(first.non_static_member)<<" "<<&(second.non_static_member)<<endl; system("pause"); } (2)成员函数 C++中所有的成员函数(静态/非静态)都存放在代码区,所有对象都享有这一份,但是静态成员函数和非静态成员函数在调用成员变量却有着限制 (1)静态成员函数不属于某个对象,它属于整个类,在类外部调用的时候你可以通过两种方式调用 1)class:: staticMethod() 2) classObject.staticMethod() 也正因为静态成员函数属于整个类,所以在其内部不存在this指针;而在非静态成员函数内部会存在一个隐藏的this指针,用来标定当前是哪个类的实例调用了此函数; 然后呢,静态成员函数不能直接调用类的非静态成员变量,因为从上边我们知道非静态成员变量在类的实例创建时才会分配内存,而我们的静态成员函数在类的实例创建之前已经存在,你总不能去用还没创建的东西吧? #include <iostream> using namespace std; class MyClass { public: MyClass(){ this->non_static_member=10;} static void display(); static int static_member; int non_static_member; }; int MyClass::static_member=5; void MyClass::display() { cout<<static_member<<endl; cout<<non_static_member<<endl; //error C2597: illegal reference to non-static member 'MyClass::non_static_member' } int main() { system("pause"); }
但是我们却可以通过静态成员函数的形参来间接调用某个对象的非静态成员变量; #include <iostream> using namespace std; class MyClass { public: MyClass(){ this->non_static_member=10;} static void display(MyClass obj); static int static_member; int non_static_member; }; int MyClass::static_member=5; void MyClass::display(MyClass obj) { cout<<obj.static_member<<endl; cout<<obj.non_static_member<<endl; } int main() { MyClass a; MyClass::display(a); system("pause"); }