《深度摸索C++对象模子》读书笔记(4)[VC/C++编程]
本文“《深度摸索C++对象模子》读书笔记(4)[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
***非静态成员函数(Nonstatic Member Functions)***
C++的计划原则之一就是: nonstatic member function至少必须和普通的nonmember function有相同的效率.也就是说,假如我们 要在以下两个函数之间作挑选:
float magnitude3d(const Point3d *this) { ... }
float Point3d::magnitude3d() const { ... }
那么挑选member function不该该带来 什么额外负担.因为编译器内部已将“member函数实体”转化为对等的“nonmember函 数实体”.下面是magnitude()的一个nonmember定义:
float Pointer3d::magnitude() const
{
return sqrt(_x*_x + _y*_y + _z*_z);
}
// 内部转化为
float magnitude_7Point3dFv(const Point3d *this) //已对函数名称举行 “mangling”处理
{
return sqrt(this->_x*this->_x + this- >_y*this->_y + this->_z*this->_z);
}
目前,对该函数的每一个调 用操作也都必须转换:
obj.magnitude();
// 转换为
magnitude_7Point3dFv (&obj);
关于class中的memeber,只需在member的名称中加上class名称,便可形成 举世无双的命名.但由于member function可以被重载化,所以需求更遍及的mangling伎俩,以供应绝对 举世无双的名称.此中一种做法就是将它们的参数链表中各参数的范例也编码进去.
class Point {
public:
void x(float newX);
float x();
...
};
// 内部转化为
class Point {
void x_5PointFf(float newX); // F表示function,f表示其第一个参数范例是float
float x_5PointFv(); // v表示其没有参数
};
上述的mangling伎俩可在链接期间查抄出任何不精确的调用操作,但由于编码 时未考虑返回范例,故假如返回范例声明错误,就无法查抄出来.
***虚拟成员函数(Virtual Member Functions)***
关于那些不支持多态的对象,经过一个class object调用一个virtual function,这种操作应当老是被编译器像对待普通的nonstatic member function一样地加以抉择:
// Point3d obj
obj.normalize();
// 不会转化为
(*obj.vptr[1]) (&obj);
// 而会被转化未
normalize_7Point3dFv(&obj);
***静态 成员函数(Static Member Functions)***
在引入static member functions之前,C++要求全部 的member functions都必须经过该class的object来调用.而实际上,假如没有任何一个nonstatic data members被直接存取,事实上就没有必要通过一个class object来调用一个member function.这样一来便 产生了一个冲突:一方面,将static data member声明为nonpublic是一种好的习惯,但这也要求其必须 供应一个或多个member functions来存取该member;另一方面,固然你可以不靠class object来存取一 个static member,但其存取函数却得绑定于class object之上.
static member functions恰是 在这种情形下应运而生的.
以上是“《深度摸索C++对象模子》读书笔记(4)[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |