首先定义一个类X
class X
{
public:
X();
X(const X& x); virtual ~X(); virtual foo();
}
再来一段代码:
X foobar()
{
X xx;
X *px = new X; //foo 是一个虚函数
xx.foo();
px->foo(); delete px;
return xx;
};
以上这个函数中包括了虚函数调用,构造,NRV优化,虚析构等部分。以下代码展示了用C代码描述样子:
//为了避免多次复制,直接将接收返回值的对象作为引用参数传入 void foobar(X &_result)
{
//X xx
//构造 _result
//调用传入对象的构造函数
//_result.X:X()可以理解为调用_result对象的X类中的X函数
_result.X:X(); //X *px = new X;
//这里的_new相当于malloc 是一个单纯的内存分配函数
//然后再对px指向的对象调用默认构造函数
px = _new(sizeof(X))
if(px != )
px->X::X() //xx.foo()
//虽然foo是个虚函数,但是xx.foo是直接通过对象调用的,不需要经过虚函转换,所以类似一般的函数调用,吧对象作为第一个参数直接传入
foo(&_result) //px->foo()
//使用虚函数表进行调用
(*px->vbtl[])(px) //delete px
//_delete相当于free
if(px) {
(*px->vbtl[])(px);
_delete(px); //由于做了NRV,所以不需要进行额外的创建匿名对象
return;
}