时隔两周,加入字节跳动后的第一篇技术博客
一般方法
类方法
目前对于类方法的调用,各个语言主要有两种方式
(这里所说的显示和隐式的主要是说对于类方法,this
指针的声明方式)
C++的隐式调用
在C++中,使用操作符.
或者->
来访问一个类的成员变量或者成员方法。如:
class Foo{
public:
static void bar(int val){}
void func(int val){}
};
int main(){
Foo::bar(1);
Foo foo;
foo.func(2);
// auto foo = new Foo(3);
// foo->func(4);
}
python的显示调用
class Foo{
def func(self, val):
pass
@classmethod
def bar(cls, val):
pass
}
可见,相对于C++,python的每一个成员方法都显式的指明了self
或cls
。但这只是声明方式的不同,其本质依然是一样的。
之所以这么说,是因为在计算机中,无论什么语言的函数的调用,其汇编代码大致都是一样的。比如上面例子中函数fun
的调用,其汇编代码大概是:
func:
pass
main:
...
mv val 1
push val
call func
简单的说是因为,汇编中函数的调用都是通过栈来传递参数,即便像C++这种所谓的隐式调用,依然少不了push this
这个过程。即,你完全可以通过找到一个成员函数的地址,然后传递this
指针和参数来调用该成员函数。比如fun
地址为0xffff0381,则obj->func(1)
等同于*0xffff0381(this, 1);