第四章 Function 语意学

Member的各种调用方式:

Nonstatic Member Function

 实际上Members functions被内化为nonmember的形式:

 1. 改写函数以安插一个额外的参数到Members functions中,用以提供一个存取管道,使class Object得以将此函数调用,该额外参数称为this指针。

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

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

Virtual Member functions:

 *ptr->vptr[1](ptr)相当于this指针 ptr

经由一个class object调用一个virtual function,这种操作应该总是被编译器像对待一般nonstatic member function一样加以决议。

Static member function:

  它不能够直接存取class中的nonstatic members

  它不能够被声明为const volatile virtual

  它不需要经由class object才被调用。

 如果取一个其地址,获得的将是其在内存中的位置,也就是其地址。由于其没有this指针。所以地址类型并不是一个指向class member function的指针,而是一个nonmember函数指针。

Virtual Member Function:

 一个class只会有一个virtual table。每一个table内含其对应之class object中所有active virtual function的地址中激活virtual function.其中包括:

  要重写的函数。

  继承自base class的函数实例

  一个pure_virtual_called()函数,它既可以扮演pure virtual function的空间保卫者角色,也可以当做执行期异常处理函数。如果该函数以外被调用,通常是结束这个程序。

多重继承下的virtual functions:

 在多重继承下,一个derived class 内涵n-1个额外的virtual tables。针对每一个virtual tablesderived对象有对应的vptr.

 允许虚函数的返回类型不同

Base2*pb1=new derived;

Base2*pb2=pb1->clone();会有一个类型转换把pb1->clone转换为base2;

指向Member function的指针:

nonstatic 如果该函数不是虚函数,得到的是它在内存中真正的地址。它也需要绑定到对象地址上。

 Double (point::*cord)()=&point::x;

调用:orgin.*cord();转换为(cord)(&orgin);其作用是this指针。

虚函数:所知道的仅是虚函数在虚表中的索引值。真实地址在编译期是未知的。

多重继承下:结构体存有索引和非虚函数地址offset

内敛函数:

   有局部变量放在一个封闭区段中,有副作用就是不能直接一一封塞程序中的每一个形式参数。一个常量表达式在替换之前先完成其求值操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值