C++学习笔记之类成员指针
类成员指针是指指向类成员函数或类成员变量的指针。与普通指针类似,类成员指针也有类型,它包含了指针所指的函数或变量的参数和返回值类型。
使用类成员指针可以方便地在程序中动态调用类中的成员函数或成员变量。类成员指针是一种相对比较复杂的指针,使用时需要注意一些细节。
1. 成员函数指针
定义一个成员函数指针的语法格式为:
返回值类型 (类名::*函数指针名称)(参数列表);
其中,返回值类型表示成员函数的返回值类型,类名表示所属类名,函数指针名称是自定义的指针变量名,参数列表表示成员函数的参数列表。
例如:
class A{
public:
int add(int a, int b){
return a + b;
}
};
int (A::*p)(int, int) = &A::add; // 定义一个指向 A 类的成员函数的指针变量 p
定义后,我们可以通过函数指针来调用成员函数,如下:
A a;
(a.*p)(1, 2); // 通过指向成员函数的指针 p 调用 a 中的 add 函数
这里需要注意的是,由于成员函数指针必须与类进行绑定,所以调用时需要先创建该类的对象,再通过对象来调用成员函数指针。
2. 成员变量指针
定义一个成员变量指针的语法格式为:
变量类型 (类名::*指针变量名);
其中,变量类型表示成员变量的类型,类名表示所属类名,指针变量名是自定义的指针变量名。
例如:
class A{
public:
int num;
};
int A::*p = &A::num; // 定义一个指向 A 类的成员变量的指针变量 p
定义后,我们可以通过指针变量来访问成员变量,如下:
A a;
a.*p = 10; // 通过指向成员变量的指针 p 访问 a 中的 num 变量
这里需要注意的是,成员变量指针必须与类进行绑定,所以访问时需要先创建该类的对象。
3. 类成员指针的应用
类成员指针广泛应用于函数指针和回调函数中。在调用qsort函数时,可以使用类成员函数指针来作为比对函数,来实现对对象的排序。
示例代码:
#include <stdio.h>
#include <stdlib.h>
// 定义一个人的结构体
struct Person{
char name[20];
int age;
};
// 按照年龄从小到大的顺序排序
bool cmpAge(const Person &a, const Person &b){
return a.age < b.age;
}
// 按照姓名从小到大的顺序排序
bool cmpName(const Person &a, const Person &b){
return strcmp(a.name, b.name) < 0;
}
// 排序函数
void sortByAge(Person *arr, int n, bool (Person::*cmp)(const Person &, const Person &)){
for(int i = 0; i < n - 1; i++){
for(int j = i + 1; j < n; j++){
if((arr[i].*cmp)(arr[i], arr[j])){
Person temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
int main()
{
Person arr[3] = {{"Tom", 18}, {"Jerry", 16}, {"Mike", 20}};
sortByAge(arr, 3, &Person::cmpAge); // 按照年龄排序
for(int i = 0; i < 3; i++){
printf("%s, %d
", arr[i].name, arr[i].age);
}
return 0;
}
上述代码将类成员函数指针用于排序函数中,可以实现对对象按照不同的规则进行排序。
需要注意的是,成员函数指针和普通函数指针不同,成员函数指针必须指向该成员函数所属的类,所以调用时需要先创建该类的对象。
