Function语意学 Member的各种调用方式

Nonstatic Member Functions

nonstatic member functions和一般的nonmember function有相同的效率。也就是说下边两种函数效率相差不多。

float func(const ClassA *this){...}//nonmember function
float ClassA::func() const{...}//nonstatic member functions

因为member function将会编译器被转化为nonmember形式,按以下步骤:
①添加额外参数中添加this指针。
②将对nonstatic data member的存取操作改为由this来存取
③把member function重写为外部函数,函数名称将会修改。
例子:

float ClassA::func(){
    return _x + _y;
}
//被改写成类似这样⬇️
float func_ClassA(ClassA *this){//被修改的函数名在不同编译器中有不同策略,不过对编程来说影响不大,想要了解命名策略可以上网查找。
    return this->_x + this->_y;
}
//所以:

ClassA obj;
ClassA *ptr = &obj;
obj.func();
ptr->func();
//两种调用方式的效率应该一样,被转化为:

func_ClassA(&obj);
func_ClassA(ptr);

Virtual Member Functions

如果virtualFunc();是一个virtual member function,那么:

ptr->virtualFunc();
//将会转化为:
(* ptr->vptr[1] )( ptr );
//vptr是指向virtual table的指针;
//1是virtual table slot的索引值;
//第二个ptr表示this指针;

Static Member Functions

如果staticFunc();是一个Static Member Functions,那么

obj.staticFunc();
ptr->staticFunc();
//被转化为
staticFunc_ClassA();//由编译器将函数名改写。并被提出于class声明之外
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值