zxlben

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

首先定义一个类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;  
}

 

posted on 2013-11-22 15:12  zxlben  阅读(122)  评论(0编辑  收藏  举报