成员指针

来源:互联网 发布:c语言里 n 编辑:程序博客网 时间:2024/06/05 20:28

成员指针

成员变量指针

一.声明、定义和初始化

•类型 类名::*成员变量指针 = &类名::成员变量;

class Student      {         public:                 string m_name;                 string m_sex;                 int m_age;                 int m_no;      };    –int Student::*p_age = &Student::m_age;

二.解引用

•对象.*成员变量指针
–“.*”是一个独立的运算符,成员指针解引用运算符
Student student (…);
student.*p_age = 25;

•对象指针->*成员变量指针
–“->*”是一个独立的运算符,间接成员指针解引用运算符
Student* student = new Student (…);
student->*p_age = 25;

三.保存相对地址

•成员变量指针的本质,就是特定成员变量在类对象实例中的相对地址

•成员变量指针解引用,就是根据类对象实例的起始地址,结合成员变量指针中的相对地址,计算出具体成员变量的绝对地址,并访问之
这里写图片描述

成员函数指针

一.声明、定义和初始化

•返回类型 (类名::*成员函数指针) (形参表) = &类名::成员函数名;

    –class Student      {         public:                 void who (void) const                 {                     cout << "我是" << m_name << ",性别" << m_sex << ",今年" << m_age << "岁,学号" << m_no << endl; }                 };    –void (Student::*p_who) (void) const = &Student::who; //&不能省

二.解引用

•(对象.*成员函数指针) (实参表)
–Student student (…);
(student.*p_who) ();

•(对象指针->*成员函数指针) (实参表)
–Student* student = new Student (…);
(student->*p_who) ();

•虽然成员函数并不存储在对象中,不存在根据相对地址计算绝对地址的问题, 但也要通过对象或对象指针对成员函数指针解引用,其目的只有一个,即提供this指针

静态成员指针

一.静态成员变量指针

•声明、定义和初始化
–类型* 静态成员变量指针 = &类名::静态成员变量;

 class Student  {     public:             static Teacher s_teacher;  };  Teacher* p_teacher = &Student::s_teacher;

•解引用
–静态成员变量指针->成员
cout << p_teacher->m_age << endl;

–*静态成员变量指针 cout << (*p_teacher).m_age << endl;

•类的静态成员变量不是对象的一部分,不需要根据相对地址计算绝对地址,也不需要通过对象或其指针解引用

二.静态成员函数指针

•声明、定义和初始化
–返回类型 (*静态成员函数指针) (形参表) = 类名::静态成员函数名;

class Student { public:         static Student* create (void); }; Student* (*p_create) (void) = Student::create;

•解引用
–静态成员函数指针 (实参表) Student* student = p_create ();

•类的静态成员函数没有this指针,无需调用对象

三.与普通指针无异

•静态成员与对象无关,因此静态成员指针与普通指针并没有任何本质性区别

•所有成员指针,无论静态与否,都受访问控制属性约束

class Student  {     private:             int m_age;             static Teacher s_teacher;  };–int Student::*p_age = &Student::m_age; // 错误  Teacher* p_teacher = &Student::s_teacher // 错误