加盟网站建设,百度和阿里哪个厉害做网站,电子商务网站建设的必要性,百度推广登陆后台成员函数指针作为参数时#xff0c;静态函数和非静态函数的区别
举个 QT 的例子#xff08;没学过QT的也不要紧#xff0c;这适用于学习C的同学#xff09;#xff0c;当我有两个类#xff0c;Teacher 类和 Student 类。现在有一个场景就是#xff0c;Teacher 类会发出…成员函数指针作为参数时静态函数和非静态函数的区别
举个 QT 的例子没学过QT的也不要紧这适用于学习C的同学当我有两个类Teacher 类和 Student 类。现在有一个场景就是Teacher 类会发出信号然后 Student 类去处理。调用的是 connect 函数。
Teacher 类
Student 类 //创建一个老师对象this-tc new Teacher(this);//创建一个学生对象this-st new Student(this);//老师饿了学生请客的连接connect(tc,Teacher::hungry,st,Student::treat);注意这里connect 函数的第二和第四个参数都是要传入函数指针。
但这时很多人就会产生一个疑问传入函数指针不就是传入函数的地址。那写 Teacher::hungry 不就是地址吗为什么把 这个符号去掉就会报 error: call to non-static member function without an object argument 这个错误。
这是因为在 C 中Teacher::hungry 表示的是成员函数本身而不是它的地址。 当你尝试直接传递 Teacher::hungry 作为函数参数时编译器会认为你尝试调用一个非静态成员函数但没有提供对象来调用它。这就是为什么会出现编译错误提示 “call to non-static member function without an object argument”。 而使用 Teacher::hungry 的语法则表示获取 Teacher::hungry 成员函数的地址并将这个地址作为成员函数指针进行传递。通过使用 运算符你告诉编译器你要获取成员函数的地址而不是直接调用它。
因此在调用类的成员函数时你应该使用 ClassName::MemberFunction类名::成员函数 的语法来获得成员函数的地址并将其传递给相应的函数或函数模板进行处理。这样可以确保编译器正确地解析成员函数指针并且可以提供正确的对象来调用非静态成员函数。
如果因为这里 Teacher 类中的 hungry 函数只是作为一个信号取了 static 后传入 connect 函数会报错所以就以 Student 类的 treat 函数来举例 这里加了 static相当于现在这个 treat 函数是静态函数。 所以可以直接这样传入并不会报错这是为什么呢
如果 Student::treat 是一个静态成员函数那么在将其传递给函数参数时不需要使用 运算符获取其地址也不需要提供对象来调用它。 静态成员函数是与类相关联的函数而不是与类的实例对象相关联的。因此你可以直接使用类名和作用域解析操作符 :: 来访问静态成员函数而不需要提供对象。这样子直接传入编译器自然会知道现在指的是静态成员函数的指针。