• Inside The C++ Object Model


    首先定义一个类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;  
    }
  • 相关阅读:
    自定义CopyOnWriteHashMap
    NIO中Buffer缓冲区的实现
    TOMCAT原理详解及请求过程
    XSS的原理分析与解剖
    mysql分页查询优化
    java如何正确停止一个线程
    Centos搭建ElasticSearch
    redis集群原理
    Idea-每次修改JS文件都需要重启Idea才能生效解决方法
    java 加密 解密 Illegal key size
  • 原文地址:https://www.cnblogs.com/zxlben/p/3437609.html
Copyright © 2020-2023  润新知