C/C++中函数到底是什么?
个人觉得为了提高水平,不必纠结某些概念细节。即不用理解什么到底是什么的概念。既然提出了,个人觉得函数是一种特殊的变量,而函数指针正是
指向这种特殊变量的指针。例如,在C中。
//以下是伪代码
FuncType funcName; // FuncType = 函数原型
可以这样调用funcName函数。
1--> funcName(....);
2--->(&funcName)(...);
或一个指向盖函数的函数指针。此函数指针的函数原型和funcName一样。
假设类型为: T (*)(...),声明如下
T (*funcPtr)(...) = funcName;
或
T (*funcPtr)(...) = &funcName;
可以如下调用:
funcPtr(...);
或
(*funcPtr)(...);
对函数名取地址相当于获取了指向该函数的指针(在全局的非类的成员函数的条件下)。
但是,同理,类的静态成员函数本质上并不是类的成员函数,而是非类成员函数。其调用
不依赖于对象(this指针),编译链接期间生成的函数符号的函数原型和最初一模一样,变得只是函数名。
所以类的static成员函数在使用上和上述的全局的成员函数别无二致。
可以这样声明使用:
ClassType::static_member_function(...);
obj.static_member_function(...);
(&static_member_function)(...);
声明如下:
class ClassType
{
public:
T static_member_function(...);
};
T (*pStatic)(...) = static_member_function(...);
或
T (*pStatic)(...) = &static_member_function(...);
调用可以这样:
pStatic(...);
(*pStatic)(...);
((ClassType*)0)->static_member_function(...);//因为静态成员函数等价于全局的非类成员函数,调用不依赖于对象(this指针),记住这点即可。
因为静态成员函数等价于全局的非类成员函数,调用不依赖于对象(this指针),记住这点即可。
静态成员函数很重要的一点就是作为回调函数。
静态成员函数本质是全局函数,而非成员函数。其类型是函数指针。
而真正的成员函数(非虚函数)的类型是指向成员函数的指针。