object model-Function 语意学

本文探讨了C++中非静态成员函数与静态成员函数的区别,重点在于多态性。非静态成员函数在编译时通过this指针访问对象数据,而静态成员函数不具备this指针,无法直接访问非静态成员数据。虚拟成员函数的实现涉及到虚函数表,每个对象有一个vptr指向对应的虚函数表。多继承和虚继承情况下的虚拟成员函数处理复杂,需要在运行时调整this指针。同时,文章提到了指向成员函数的指针,特别是对虚拟成员函数的处理,其地址实际上是虚函数表中的索引值。
摘要由CSDN通过智能技术生成

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);
<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值