容易引起误解的是->操作符,特别是没什么基础的初学者在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就是一个对象,这时候就可以使用成员操作符.了。之所以用(),是因为.的优先权大于*。