首先定义一个类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 != 0) px->X::X() //xx.foo() //虽然foo是个虚函数,但是xx.foo是直接通过对象调用的,不需要经过虚函转换,所以类似一般的函数调用,吧对象作为第一个参数直接传入 foo(&_result) //px->foo() //使用虚函数表进行调用 (*px->vbtl[2])(px) //delete px //_delete相当于free if(px) { (*px->vbtl[1])(px); _delete(px); //由于做了NRV,所以不需要进行额外的创建匿名对象 return; }