首页 > 编程知识 正文

乚c是代表什么意思(讠C)

时间:2023-05-04 06:51:27 阅读:73442 作者:4540

前言对于c语言,c在类的设计中存在两种特殊的设计:

成员函数将重载非静态成员函数,编译器在编译成员函数时隐式添加this,并将当前对象的地址分配给this。

在本文中,关于第二个特性,在类中,static不仅可以声明静态成员变量,还可以声明静态成员函数。 因为可以访问常规成员函数,所以成员(包括成员变量和成员函数),静态成员函数只能访问静态成员

只有在创建对象后,才会从对象中调用常规成员函数。 这是因为需要当前对象的地址。 另一方面,静态成员函数可以直接从类中调用,编译器不会向其添加形状参数this。 由于不需要当前对象的地址,因此无论是否创建对象,都可以调用静态成员函数。

常规成员变量占用对象的内存,静态成员函数没有this指针,不知道指向哪个对象,并且无法访问对象的成员变量。 这意味着静态成员函数不能访问常规成员变量,只能访问静态成员变量。

普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。

重点: 静态成员函数与普通成员函数的根本区别在于:普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。

本文介绍将c类成员函数注册为回调函数。 为什么需要该成员函数时需要静态成员函数呢?

该示例说明了根据以下hello类的实现,c类的成员如何实现为callback

Hello.h的实现,

# includeiostreamnamespacehi { class hello }公共: typedef void (* event callback ) (void ); 光晕(); ~hello (; void say_hi (; 语音事件回退(事件回退; 隐私:事件呼叫回退Cb; 语音事件(; (; (} Hello.cpp的实现,

# include ' hello.h ' namespace hi { hello 33603360 hello () STD 33603360 cout ' construct hello ' STD 33603360 endl; 设置呼叫回退(onevent; }hello:~hello () STD :3360 cout ' destruct hello ' STD 3360: endl; }void hello:say_hi () STD : cout ' sayhi ' STD 3360: endl; if(CB!=空值(CB ); } void hello :3360 setevent callback (eventcallbackc ) { cb=c; }void hello:onEvent () STD :3360 cout ' onevent sayhi ' STD 33603360 endl; }} main.cpp的实现如下。

# include iostream # include ' hello.h ' int main (int argc,char * * qrgv (hi 33603360 hello * hi=newhi 33603360 hello hi-sargv delete hi; 返回0; }以上实现的代码非常简单,这里不说明。然后在Linux的终端下,编译上述代码,

CG hello.CPP hello.hmain.CPP hello.CPP : in constructor‘hi :3360 hello 33603360 hello,hello (() ) ) ) ) ) ) 652’: hello.CPP 336083360293360 error : invaliduseofnon-staticmemberferfon lo.h :17:103360 note : declaredherevoidonevent (; ^~~~~~~但是,结果发生了编译错误。 因为从编译的错误消息来看,onEvent是非静态成员函数。

hello.CPP 336083360293360 error : invaliduseofnon-staticmemberfunction‘void hi : hello 3360: onevent’当前hello类

void hello:onEvent )与void事件呼叫) void )相匹配,但是这里为什么会报告错误呢?

根据本文***前言***中所述,由于hello类中定义的实现的onEvent是非静态成员函数,编译器在编译时隐式添加this,并将当前对象的地址设置为this 这与setEventCallback中定义的函数指针类型不匹配,并导致许多问题

那么? 如何修改才能注册为回调函数?

其实编译器已经有了明确的提示: error: invalid use of non-static member

所以我对Hello.h进行了简单的修改,对onEvent添加了静态修饰,onEvent修改为静态成员函数。

# includeiostreamnamespacehi { class hello }公共: typedef void (* event callback ) (void ); 光晕(); ~hello (; void say_hi (; 语音事件回退(事件回退; 隐私:事件呼叫回退Cb; 静态语音开启(; (; }然后编译执行,执行结果为以下:

c./a.outconstructhellosayhioneventsayhidestructhello如上所述,通过hello类的实例化对象运行成员函数say_hi时,onevent正确调用

总结回调函数的使用,我们日常开发中常用的方式,希望通过本文能够更好地理解c中定义回调函数声明时的细节。 也可以通过这种简单的实施例进一步加深c中基于static的成员函数的修饰。

参照链接:

在GLib中实现c成员函数的回调注册

c静态静态成员函数详细信息

c函数指针类成员函数指针

类成员函数作为回调函数的方法和注意事项

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。