若将成员变量声明为static,则为静态成员变量,与一般的成员变量不同,无论建立多少对象,都只有一个静态成员变量的拷贝,静态成员变量属于一个类,所有对象共享。静态变量在编译阶段就分配了空间,对象还没创建时就已经分配了空间,放到全局静态区。
静态成员变量
注意事项:(1)最好是类内声明,类外初始化(以免类名访问静态成员访问不到);(2)无论公有,私有,静态成员都可以在类外定义,但私有成员仍有访问权限;(3)非静态成员类外不能初始化;(4)静态成员数据是共享的。
1 class Person{ 2 public: 3 static int m_age;//静态成员变量,会共享数据,对象保有的是最后一次修改的值 4 //最好类内声明,类外初始化 5 6 //静态成员建议在类外进行初始化,但在类内也可以初始化,只是通过类名访问静态成员的属性时,访问不到 7 //所以一般不这么做 8 public: 9 Person(){ 10 m_age = 10; 11 } 12 13 private: 14 int other; 15 static int m_other; 16 }; 17 int Person::m_age = 0; 18 int Person::other = 10; //非静态成员不能在类外部定义 19 int Person::m_other = 20; //静态成员可以在类外定义 20 21 void test01(){ 22 //通过对象访问属性 23 Person p1; 24 p1.m_age = 10; 25 26 Person p2; 27 p2.m_age = 20; 28 29 cout << "p1.age = " << p1.m_age << endl; //20 30 cout << "p2.age = " << p2.m_age << endl; //20 31 32 //通过类名访问属性 33 cout << "类名访问属性" << Person::m_age << endl; //20 34 35 //静态成员虽然在类外可以定义,但在类外不可访问 36 cout << "类名访问属性" << Person::m_other << endl; //私有成员,不可访问 37 } 38 39 int main(){ 40 41 test01(); 42 system("pause"); 43 return 0; 44 }
静态成员函数
静态成员函数也是对象共享的:(1)静态成员函数可以直接访问静态成员变量,不能直接访问普通成员变量,但可以通过参数传递的方式访问。(2)普通成员函数可以访问普通成员变量,也可以访问静态成员变量。(3)静态成员函数没有this指针。
非静态数据成员为对象单独维护,但静态成员函数为共享函数,无法区分是哪个对象,因此不能直接访问普通变量成员,也没有this指针。
1 class Person{ 2 public: 3 static int m_age; 4 int m_n; 5 6 public: 7 static void myfunc(int &a){ 8 m_age = 10; 9 a = 0; 10 //m_n = 1;//不可以直接访问非静态成员 11 } 12 13 void myfunc02(){ 14 m_age = 10; 15 m_n = 0; 16 } 17 private: 18 static void myfunc01(){} 19 }; 20 21 22 void test01(){ 23 //通过对象访问成员函数 24 Person p1; 25 p1.myfunc(p1.m_n); //可以通过参数传递访问非静态成员 26 27 //通过类名访问成员函数 28 cout << "类名访问属性" << Person::myfunc << endl; //20 29 30 //在类外不可访问私有静态成员函数 31 //cout << "类名访问属性" << Person::myfunc01 << endl; //私有成员,不可访问 32 }