关于面向对象中有一个让我非常不理解的问题。
比如我有个类human。里面有个方法eat(),这是个实例方法。现在human有个对象叫lz,现在lz想吃饭了,固然我会调用lz.eat();现在问题来了,eat这个方法是属于human这个类的,而不是lz这个实例对象的,为什么c++的设计者不这样设计方法的调用,即是eat(lz),每个函数的第一个参数就是eat这个函数应该操作的对象,我感觉这样的方式更合理,如果是lz.eat(),给人的感觉仿佛是eat这个方法是属于lz这个实例的,就好像如果lz这个实例不存在,eat就不存在了。
之所以会想到这个,想象下面一个恐怖的场景,lz要吃人,我们的eat方法有了一个参数,变成了eat(human victim),如果human中有一个private的字段,叫fill,用来记录是否吃饱了,当eat这个方法操作lz的fill字段的时候,没有任何问题,但是,我惊讶的发现通过lz.eat方式调用的eat函数既然可以操作victim的fill字段。当时我的理解是eat是属于lz的,他不应该能操作另外一个human类的私有字段,后来上网查了,发现是我理解错了,eat是属于human这个类的。所以产生了疑问,我认为lz.eat这样的调用方式误导性太强,还是说有什么其他原因?谢谢。
[解决办法]
这个要怪只能怪 C++ 是一个静态语言, 它的所有的权限检查都是在编译期的.
编译期的权限检查只能是针对类型的, 无法针对对象.
而且这些权限检查都是可以绕过去的.
[解决办法]
其实还有更不能让人理解的,比如
i=i+1;
i怎么可能等于i+1,i为什么值时,等式才能成立?明显是个不等式,但为啥能这么写(函数式语言除外)?
[解决办法]
产生这样的想法是因为你把类和示例放在了等同的位置上考虑了。而实际上,这二者是不同的。
显然,任何一个人都不能被称为人类,而人类也永远不是某一个人。对于某人来说,它死去就不可能再拥有eat能力了。这一点都没错,但这并不表示人类失去了eat能力。
在面向对象思维里,每一个对象都能提供自己的方法来操作自己的数据。所以用“对象名.方法名()”的方式来表达它是很清楚的形式。如果用“类名.方法名(对象)”那反而是回到了面向过程时的形式:用过程对数据进行处理——唯一的不同仅仅是过程的前面带上了一个限制词:类名。
至于对象方法里对同类对象数据的处理,那是和对象处理自己数据完全不同的表达方式。你首先要把另一个同类实例对象传递给该方法,它才有可能对其进行处理。而要处理自身的数据时,它并不要求任何传递。也就是说,这并不会导致我们在编程时误操作其它实例的数据,除非是这种操作本来就是它的本意。
[解决办法]
class A{private: int pri;public: void change() {pri=1;}; // 1# void change(A a) {a.pri=2;}; // 2#};
[解决办法]