专业编程基础技术教程

网站首页 > 基础教程 正文

详解C++指向类成员函数的指针

ccvgpt 2024-08-05 12:24:26 基础教程 13 ℃

①指向类成员函数的指针定义和使用

函数指针是存放函数入口地址的指针变量,可以通过函数指针来调用函数。指向类成员函数的指针与普通的函数指针类似,只是对函数的类型做了更严格的限定。指向类成员函数的指针不仅与函数的参数类型和个数以及返回值类型相匹配,还要与该函数指针所属的类类型匹配。即指向类成员函数的指针与所指向的函数在以下三个方面必须匹配:

详解C++指向类成员函数的指针

1)函数参数类型和个数

2)函数返回值类型

3)函数所属的类类型

由于非静态的成员函数必须通过this指针来访问对象的成员,所以指向类成员函数的指针必须与相应类的对象结合使用。具体使用方法如下:

声明:与普通函数作为比较,指向类的成员函数的指针需要在指针前加上类类型,格式如下:

typedef 返回值 (类名::*指针类型名)(参数列表);

定义:用类的成员函数地址赋值,格式如下:

指针类型名 指针名 = &类名::成员函数名;

调用:根据调用的对象是对象还是指针,分别用.*和->*进行调用,格式如下:

(类对象.*指针名)(参数列表);

(类指针->*指针名)(参数列表);


②指向类成员函数的指针的作用

在系统开发中,我们经常需要在一个模块中根据传入的不同信息调用类的原型相同的不同成员函数,这时可以指向类成员函数的指针来实现。具体可以参考下面的例子:

#include<iostream>

#include <string>

using namespace std;

class Student

{

public:

Student(const string& name, int age, int grade, int height):Student::name(name)

{

this->age = age;

this->grade = grade;

this->height = height;

}


const string& getName() {

return name;

}


int getAge() {

return age;

}


int getGrade()

{

return grade;

}


int getHeight()

{

return height;

}

private:

string name;

int age;

int grade;

int height;

};



typedef int (Student:: *PFNSTUDENT)();

const int ATTRIBUTENUM = 3;

void main()

{

Student studentA("Peter", 12, 6, 16);

PFNSTUDENT pfnStudentArray[ATTRIBUTENUM] = {

&Student::getAge,

&Student::getGrade,

&Student::getHeight

};


PFNSTUDENT pfnStudent = NULL;

string str[3] = { "Age","Grade","height" };


cout << studentA.getName() << endl;

for (unsigned int i = 0; i < ATTRIBUTENUM; i++)

{

cout << str[i] << ":" << (studentA.*pfnStudentArray[i])() << endl;

}

}

输出:

Tags:

最近发表
标签列表