首页技术成员函数指针 c++成员函数指针

成员函数指针 c++成员函数指针

编程之家2026-05-261137次浏览

大家好,今天小编来为大家解答以下的问题,关于成员函数指针,c++成员函数指针这个很多人还不知道,现在让我们一起来看看吧!

成员函数指针 c++成员函数指针

C++ 类成员函数指针语法的友好指南 | Linux 中国

C++类成员函数指针的语法确实较为复杂,但通过分步解析和示例说明,可以更好地理解其使用方法。以下是一个友好的指南,帮助你掌握这一特性。

1.理解基础:C语言中的函数指针在 C语言中,函数指针用于存储函数的地址,并通过指针调用函数。例如:

int sum(int a, int b){ return a+ b;}int(*funcPtr)(int, int)=∑//声明并赋值int result= funcPtr(2, 3);//通过指针调用这里,funcPtr是一个指向函数的指针,其签名(参数和返回类型)必须与 sum函数匹配。

2. C++类成员函数指针在 C++中,类成员函数指针的语法更为复杂,因为需要处理类的上下文。以下是关键步骤:

2.1声明成员函数指针假设有一个类 MyClass,其中包含一个成员函数 sum:

class MyClass{public: int sum(int a, int b){ return a+ b;}};声明一个指向该成员函数的指针:

成员函数指针 c++成员函数指针

int(MyClass::*methodPtr)(int, int);//声明指针注意:

MyClass::*表示这是一个指向 MyClass类成员函数的指针。签名(int(int, int))必须与目标函数匹配。2.2赋值具体函数将指针指向类的具体成员函数:

methodPtr=&MyClass::sum;//赋值这里,&MyClass::sum获取的是成员函数在虚拟函数表(vtable)中的偏移量,而非绝对地址。

2.3调用成员函数通过类的实例调用成员函数指针:

MyClass clsInstance;int result=(clsInstance.*methodPtr)(2, 3);//调用注意:

需要类的实例(clsInstance)。调用语法为(instance.*pointer)(args)。3.实际应用示例以下是一个更复杂的示例,展示如何在类内部使用成员函数指针实现动态初始化机制:

成员函数指针 c++成员函数指针

3.1定义初始化命令结构template<typename T>struct DynamicInitCommand{ void(T::*init)();//指向初始化函数的指针 unsigned int ticks;//调用延迟};3.2前端类实现class Frontend{public: Frontend(){//初始化动态命令 DynamicInitCommand<Frontend> init1{&Frontend::dynamicInit1, 5}; DynamicInitCommand<Frontend> init2{&Frontend::dynamicInit2, 10}; DynamicInitCommand<Frontend> init3{&Frontend::dynamicInit3, 15}; m_dynamicInit.push_back(init1); m_dynamicInit.push_back(init2); m_dynamicInit.push_back(init3);} void tick(){ std::cout<<"tick:"<<++m_ticks<< std::endl;//检查并执行延迟初始化 auto it= m_dynamicInit.begin(); while(it!= m_dynamicInit.end()){ if(it->ticks< m_ticks){ if(it->init)((*this).*(it->init))();//调用成员函数指针 it= m_dynamicInit.erase(it);} else{++it;}}}private: void dynamicInit1(){ std::cout<<"dynamicInit1 calledn";} void dynamicInit2(){ std::cout<<"dynamicInit2 calledn";} void dynamicInit3(){ std::cout<<"dynamicInit3 calledn";} unsigned int m_ticks{0}; std::vector<DynamicInitCommand<Frontend>> m_dynamicInit;};3.3主函数模拟int main(){ Frontend frontendInstance; while(true){ frontendInstance.tick(); std::this_thread::sleep_for(std::chrono::milliseconds(200));}}说明:

DynamicInitCommand存储初始化函数指针和调用延迟。Frontend::tick()根据 m_ticks的值动态调用初始化函数。调用语法((*this).*(it->init))()解析:*this:当前类的实例。

it->init:成员函数指针。

.*:通过实例调用成员指针的运算符。

4.总结语法复杂性:类成员函数指针的语法(如(instance.*pointer)(args))确实比普通函数指针更复杂,但遵循固定模式后易于掌握。应用场景:适用于需要动态调用类成员函数的场景(如回调机制、延迟初始化等)。多态支持:成员函数指针指向 vtable条目,支持多态。5.扩展思考C++中还有更复杂的语法,例如:

嵌套模板和成员指针:结合模板和成员指针的深层嵌套。std::function和 lambda:现代 C++中更灵活的替代方案。如果需要进一步简化,可以考虑使用 std::function和 lambda表达式,它们提供了更直观的接口:

std::function<void()> func= [this](){ this->dynamicInit1();};func();//直接调用通过以上指南,希望你能更自信地使用 C++类成员函数指针!

C++的成员函数和普通函数

首先要知道类存在的理由,为何要面向对象。

C中的结构体就是定义一种数据格式,可以存储若干数据元素,并且它们的内存是连续的。

结构体的作用是封装一组有关联的属性,它们共同维护某种概念实体的状态。

在早期经典纯C工程当中,有经验的开发者早就开始利用结构体与函数指针实现简单的面向对象。

但是用结构体+函数指针使用不方便不灵活,所以C++最大的使命,面向对象就诞生了。

要注意的是C++与C的区别除了类之外,还有函数多态的特性、命名空间、STL等等特性。

类相比于结构体+函数指针最大的优势就是两个字:继承

撤了一大堆废话,针对LZ的问题可以归结为,在没有属性的时候,只有函数,使用类好不好,或者说何时可以如此使用。

如果LZ学习过设计模式,那么这个问题就颇为清晰,类的存在是为了更灵活地描述某种概念实体以及对它的操作。

一个只有函数而没有属性的类,其描述的实体可以认为是一种抽象的动作实体。

用通俗的话来讲,一个继承Animal的Cat类描述一个猫,猫有属性(形态,叫声,年龄等),也有动作(吃喝拉撒睡),这就是最经典LZ也熟知的一种类。

而抽象的动作类,就有比如一个继承File的DiskFile或者FtpFile等,它主要描述的是一组动作(读与写),它也许有状态(属性),也许没有。

这种抽象的动作类为何而存在?经典的策略设计模式就会大量地使用这种写法。

比如你要做视频处理软件,视频需要解码与加码如果只是用纯函数的化你的代码就会如下丑陋:

if(0==strcmp(fileType,AVI)){

decode_AVI(file);

}elseif(0==strcmp(fileType,MP4)){

decode_MP4(file);

}

.....

if(0==strcmp(fileType,AVI)){

encode_AVI(file);

}elseif(0==strcmp(fileType,MP4)){

encode_MP4(file);

}但是如果你有一个类AVType,只有两个函数:encode、decode,然后有AVIType、MP4Type继承它,那么你的代码大致就是:

AVType*type=newAVIType();//orMP4Type

type->decode(file);

....

type->encode(file);当你的同类方法多起来(如rmvb、wmv、flv解码器等等),你就会发现后者有多优秀。

最后总结对LZ的问题的回答就是:

如果没有继承也不会存在潜在继承的可能,也就是说用不到C++的多态特新,那么没有属性的类就没有存在的必要。

今天闲的无聊,说了一堆废话,LZ跳着看就行了O(∩_∩)O~

成员函数指针的解引用怎么理解

p是指向Base类(及其子类)的对象的指针。pf是指向类Base的成员函数的指针,就是说pf是指向函数的指针,但只能用它指向Base的成员函数,当然这个成员函数还得满足pf定义的签名,即不需要参数且返回类型是void。

那么p->的意思就是引用p指向的对象的某个成员(可以是数据成员,也可以是函数成员)。比如p->print();,可以理解为调用p指向的对象的方法print。但这里需要注意的一点是:print是虚函数且p可以指向子类,因此,实际调用的可能是print方法的子类版本。

因pf是指向Base类的成员函数的指针,所以,*pf就是pf指向的成员函数。

而(p->*pf)();就是调用p指向的对象的由pf指向的成员函数。简单讲就是,调用p指向的对象的一个成员函数,但这个成员函数究竟是哪个,由指针pf给出。

成员函数指针的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c++成员函数指针、成员函数指针的信息别忘了在本站进行查找哦。

ai写作哪个最好用,ai写作哪个好用常用css选择器有哪些,css都有哪些选择器