近来越来越感觉到初学者遇到指针容易出问题,写点东西在这里,以供参考。转载请注明出处:http://hi.baidu.com/clickto/blog/item/212a0133051d90fa1a4cffc2.html。
容易引起误解的是->操作符,特别是没什么基础的初学者在cb这样的开发环境中。因为cb中的控件全部属于动态创建的,其返回的全部都是指针。所以常给人这样的感觉:"->"操作符和"."操作符一样,都是成员操作符,所不同的是"."操作符用于静态创建的对象,"->"操作符用于动态创建的对象。
不能说这种说法不对,但是不够深入彻底。回忆C语言中的指针部分,就可以想起,"->"操作符最初是运用于指针的。还记得当时老师说这个符号的时候说过:“你看这个符号的样子,它就是代表指向!”
可能常使用vcl控件,已经将"->"等价于成员操作符了。其实不然,它只是运用于指针。比如有这样一个类(结构体和类基本上一样)TDate;要创建一个类实例,一般有下面两种:
TDate date1; //method1
TDate date2 = new TDate(); //method2
第一种方法是静态创建的,它创建于栈中,返回的是一个TDate型的对象实例,就和int i 一样。而第二种方法是动态创建,它创建于堆中,返回的不是一个对象实例,而是一个指向一个TDate型对象的指针。也就是说,new操作符返回的是一个指针,这个指针指向一个对象实例。这和java或者js或c#不一样,new出来的就直接是对象,因为这些语言中没有指针。所以c++中new出来的对象必须手动delete掉,否则其内存不会自动释放。c++中的new相当于C中的mallon(),而delete相当于C中的free()。
那么如果TDate类中有个成员为int x,那么上述两种方法创建的对象分别访问x的方法为:
date1.x 和
date2->x
因为这里date1是一个对象,"."表示对象的成员,date1.x表示对象date1的成员x。而date2是一个指针,"->"表示指针的指向,date2->x表示指针指向的成员x。如果还是不太清楚,那下面的句话应该可以帮助一下理解:(*date2).x和date2->x等价。也就是说,因为date2是一个指针,那么*date2就是一个对象,这时候就可以使用成员操作符.了。之所以用(),是因为.的优先权大于*。
还想说啥来着?突然给忘了。唉,记忆力越来越差了,刚才还想着的。算了,先写这么多,以后再慢慢加上好了。