码迷,mamicode.com
首页 > 编程语言 > 详细

【C++】深度探索C++对象模型读书笔记--Function(The Semantics of Function)

时间:2015-07-18 15:28:14      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

1. Nonstatic member function(非静态成员函数)的调用方式

  编译器会将”member 函数实例“转换为对等的”nonmember函数实例“。

  对于非静态成员函数

float Point3d::magnitude3d() const{...}

  转换步骤如下:

  1. 改写函数的signature(意指:函数原型)以安插一个额外的参数到member function中,用以提供一个存取管道,使class object得以将此函数调用。该额外参数被称为this指针:

//non-const nonstatic member的扩张过程
Point3d Point3d::magnitude(Point3d *const this)

如果是member function 是const,则变成:
//const nonstatic member的扩张过程:
 Point3d Point3d::magnitued(const Point3d *const this)

  2. 将每一个”对nonstatic data member的存取操作”改为经由this指针来存取:

  3.将member function重新写成一个外部函数。将函数名称经过“mangling”处理,使它在程序中成为独一无二的词汇:

extern magnitude_7Point3dFv(
    register Point3d *const this);

  现在这个函数已经被转换好了,而其每一个调用操作也都必须被转换。于是:

1 obj.magnitude();
2 变成了:
3     magnitude_7Point3dFv(&obj);
4 5     ptr->magnitued();
6 变成了:
7     magnitude_7Point3dFv(ptr);

 

2. Virtual Member Functions(虚拟成员函数)

使用指针调用虚拟函数:

  如果normalize()是一个virtual member function,那么以下的调用:

ptr->normalize();

  将会被内部转化为:

(*ptr->vptr[1])(ptr);

  其中:

  •   vptr表示由编译器产生的指针,指向virtual table。它被安插在每一个“声明有(或继承自)一个或多个virtual functions”的class object中
  •   1是virtual table slot 的索引值,关联到normalize()函数。
  •   第二个ptr表示this指针。

  

使用类对象调用虚拟函数:

  使用类对象调用虚拟函数,其解析方式和非静态成员函数一样。对于上一节中的normalize()函数。调用方式最终被解析为:

normalize_7Point3dFv(&obj);

 

3. Static member Function(静态成员函数)

  1.静态成员函数的主要特性:

  •   它不能直接存取class中的nonstatic members
  • 它不能被声明为cosnt、volatile或virtual
  • 它不需要经由class object才被调用--虽然大部分时候它是这样被调用的

 

  2. 取一个静态成员函数的地址,获得的将是其在内存中的位置,也就是其地址。由于static member function没有this指针,所以其地址类型并不是一个“指向class member function的指针”,而是一个“nonmember函数指针“

【C++】深度探索C++对象模型读书笔记--Function(The Semantics of Function)

标签:

原文地址:http://www.cnblogs.com/vincently/p/4652795.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!