成员指针
成员变量指针
一.声明、定义和初始化
•类型 类名::*成员变量指针 = &类名::成员变量;
–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 // 错误