Functions 语意

  成员函数分为三种:nonStatic、Static 和 Virtual。另外还有inline 函数。

  继承也有三种:Single Inheritance、Multiple Inheritance 和 Virtual Inheritance。

  nonStatic 及 Static Member functions 与 nonMember 函数在效率上是没有区别的。编译器最终是将前者的调用转化成了 nonMember 的调用,在函数参数上列表上额外添加了一个 this 指针做参数。

代码
 1 float Point3d::magnitude() const
 2 {
 3    return sqrt( x * x + y * y + z * z );
 4 }
 5 
 6 //将被转化为
 7 float Point3d::magnitude( const Point3d *const this )
 8 {
 9    return sqrt( this->* this->+ this->* this->+ this->* this->y );
10 }

 

  需要关注两点:

  1. 编译器会将 Member functions 重写成一个外部函数,为保证其独一无二性,会对函数名进行“mangling" 处理,这种转化与C的是不一样的,所以如果要以C的方式转化,一般在之前说明:extern " C "。 

  2.  

代码
Point3d obj;
Point3d 
*p3d;

obj.magnitude();  
// 1
p3d->magnitude(); // 2

//这两种方式有什么区别,最主要的是,前者指明了是调用Point3d::magnitude(), 而如果 magnitude 是虚拟函数,那么得到执
//行期才能判断是调用那个子类的 magnitude();

//上面的区别,对于不同的继承方式,在效率上的影响也不尽相同。影响最大是多重继承和继承,其复杂度主要体现在,第二个及后即的
//base classes 身上,因为我们不得不在执行期调整 this 指针指向具体的类。

//我们应该有意识的尽量使用单一继承,而且把含有虚拟函数的类排在继承的第一位。
//在C#里面只有单一继承也有这方面的考虑吧。

//如果想更好的了解,这之间的关系,请参考 P159 的解析 以及 P165 页内存布局。

 

  

  3. The C++ Object Model 里面,只有 NonStatic Data 和 指向 Virtual functions table 的指针 vptr 被保存在 class object 里面(如果有 Virtual functions 的话,才会有这个指针哦),而 Static Data、Static functions 以及 Member functions 都被放置在 class object 里面,具体的内存布局见P10。

  4. 单一继承与多重继承,base class 在子类的内存里保持原样性,及在子类里的内存的分配跟它base class 本身的内存分布是一样的。

 

posted @ 2010-03-20 14:27  木叶道  阅读(221)  评论(0编辑  收藏  举报