普通成员函数调用方式
class Myclass{
public:
int i;
void myfunc(int abc){
i += abc;
}
}
void myfunc2(Myclass *point, int abc){
point->i += abc
}
int main(){
Myclass mcls;
mcls.myfunc(18); // 调用成员函数
myfunc2(&mcls, 18); // 调用全局函数
// 虽然直观上可能全局函数要比进入类中调用成员函数要慢一些
// 但是c++在语言设计的时候有一个要求 :要求对这种普通成员函数的调用不应该比全局函数效率差
// 所以基于这种要求, 编译器内部实际上是将对成员函数myfunc2() 的调用转换成了全局函数的调用
}
/*
成员函数有独立的内存地址,跟这类走,并且成员函数的地址是在编译的时候就确定好的
编译器视角的代码:
void myfunc(Myclass *const this, int abc){ // 编译器会额外的安插一个this指针,一般在参数开头
this->i + abc;
}
编译器额外增加一个this的形参 是一个指针 指向的其实就是生成的对象
常规成员变量的存取 都是通过this指针进行操作 、
输出一下函数地址;
printf("Myclass::myfunc() = %p", &Myclass::myfunc);
编译完成后的地址就已经确定好了
当代码执行到 mcls.myfunc(18);
汇编伪 代码就是如下
_ZN6MYCLASS6myfuncEI(&mcls,18) //编译器把参数塞进去
编译器把这个函数名字搞得这么复杂是为了区分继承啊,重名函数啊 等等目的就是为了唯一
*/