对象名.方法名() 比如p1.speak()
点操作是根据对象p1 变为 Person 类然后改为Person::speak() 然后再将p1放入方法实参中。
可以看成 Person::speak(p1) 也就是在p1 这个对象的Person类的成员方法 再在实参传入p1地址也就是给this
p1.month 中间点理解为加偏移量的过程
这个方法也可以看成偏移量
p1.spesk()
应该是这样
p1.speak()《==》 p1是我们这个Person::speak()方法的第一个参数 。相当于逗号分隔符 为了区分这个特殊的参数我们放在方法名之前所以用p1. 为了将方法名和对象名地址(方法参数)分割开,.区分对象名地址和方法名。这样编译器就能一个一个识别token 变量和方法 之前用括号和逗号进行分隔。放在第一个位置就是用.进行分隔 区分函数参数 和方法名
对于方法的圆括号是调用函数的运算符 也是 分割方法名 和方法参数的分隔符
就是 call 方法名就是完事了 到方法去call 这个真正方法的地址就好了
https://blog.csdn.net/weixin_45651336/article/details/115221088
因为a.Person::fun(b) 其实就是Person::fun(a,b)底层汇编告诉了你
直接理解为编译时候类名地址加方法地址 编译程序自动计算 编译阶段 从汇编-s 也就是从.c或.java到-s文本的时候一直就已经有了加地址的文本描述 到最后-o 生成exe 时候仅仅翻译下就好了
然后Call 这个加好的类名地址和方法地址之和的地址就好了
gpt
04-16
405
09-25