若将成员变量声明为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 }
来源:https://www.cnblogs.com/qinguoyi/p/10248620.html