静态成员变量和成员函数

  若将成员变量声明为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 }

猜你喜欢

转载自www.cnblogs.com/qinguoyi/p/10248620.html
今日推荐