0.member的各种调用方式
注意本节是介绍class member data的各种访问(调用)方式
a.nonstatic member functions(非静态成员函数)
好吧,个人觉得作者自己是非常懂的,但是他讲出来的时候,感觉真的好混乱。通常都是给一个例子,自己体悟,做总结的那些话,总是不放在最显眼的位置。让人抓不到重点。歪果仁都是这么随性吗,讲到哪儿是哪儿
辨析member function 和nonmember function
class People { private: int step; public: People():step(0){} void getUp() { step++; } void work() { step++; } void goSleep() { step++; } //member fuction void PeopleAction() { getUp(); work(); goSleep(); } }; //同等功能的nonmember fuction void PeopleAction(const People *p) { p->getUp(); p->work(); p->goSleep(); }
c++的设计准则之一就是:nonstatic member function 要与一般的nonmember function有相同的效率。
举个小栗子(nostatic member function 其实都是最后被编译器转化成nonmember function的)
nostatic member function
class Point3d { private: double _x; double _y; double _z; public: double magnitude()const { return sqrt(_x*_x+_y*_y+_z*_z); } Point3d normalize()const { double mag=magnitude(); Point3d normal; normal._x=_x/mag; normal._y=_y/mag; normal._z=_z/mag; return normal; } };
转化步骤:
1. 改写函数的signature以安插一个额外参数(this指针)到member function中
//第一个const表示函数是const的,第二个const表示this指针是const的 double magnitude( const Point3d * const this)
2.将每一个对nonstatic data member的存取操作改为由this指针存取
{ return sqrt(this->_x*this->_x+this->_y*this->_y+this->_z*this->_z); }
3.将member function重新写成一个外部函数,并将函数名称经过magling(所谓的Name Mangling是指在member的名称上加上class名称以及member function的signature)处理,使它成为在程序中独一无二的语汇<extern double magnitude_7Point3dFv(const Point3d *const this);