zoukankan      html  css  js  c++  java
  • 认识C++中的临时对象temporary object 分类: C/C++ 2015-05-11 23:20 137人阅读 评论(0) 收藏

    C++中临时对象又称无名对象。临时对象主要出现在如下场景。

    1.建立一个没有命名的非堆(non-heap)对象,也就是无名对象时,会产生临时对象。

      Integer inte= Integer(5); //用无名临时对象初始化一个对象

    2.构造函数作为隐式类型转换函数时,会创建临时对象,以值的方式传递,用作实参传递给函数。
    例:

    class Integer
    {
    public:
        Integer(int i):m_val(i){}
        ~Integer(){}
    private:
        int m_val;
    };
    
    void testFunc(Integer itgr)
    {
        // do something
    }

    那么语句:
    int i = 10;
    testFunc(i);
    会产生一个临时对象,作为实参传递到testFunc函数中。

    3.函数返回一个对象时,会产生临时对象。以返回的对象最作为拷贝构造函数的实参构造一个临时对象。

    Integer Func()
    {
        Integer itgr;
        return itgr;
    }
    
    void main()
    {
        Integer in;
        in = Func();
    }

    如下代码验证以上结论:

    class Integer
    {
    public:
    Integer()
    {
      cout<<"Integer default Constructor"<<endl;
    };
    
    Integer(const Integer& arg)
    { 
      this->m_val=arg.m_val;
      cout<<"Integer Copy Constructor"<<endl;
    };
    
     Integer(int i):m_val(i){
    cout<<"Integer Constructor"<<endl;
    };
    
    Integer& operator=(const Integer& arg)
    {
       cout<<"Assignment operator function"<<endl;
       this->m_val=arg.m_val;
    }
    
    ~Integer(){};
    
    int m_val;
    };
    
    Integer testFunc(Integer inter)
    {
        inter.m_val++;
        cout<<"before return"<<endl;
        return inter;
    }
    int main(int argc,char* argv[])
    {
        Integer inter(5);//Constructor
        Integer resutl;  //default constructor
        resutl=testFunc(2);//Constructor,then Copy Constructor,then Assignment operator
        cout<<resutl.m_val<<endl;
        getchar();
        return 0;
    }

    运行结果:
    这里写图片描述

    思考:
    1.main函数中加入如下一条语句会输出什么?

    Integer re=inter;//输出Assignment operator还是Copy Constructor

    推理应该输出Assignment operator function。但实际输出结果是:Integer Copy Constructor。
    原因是:赋值符函数不能创建新的对象,它要求”=”的左右对象均已存在,它的作用就是把”=”右边的对象的值赋给左边的对象。

    2.main函数中加入如下一条语句会输出什么?

    Integer re=testFunc(10);

    按照以上讨论,推理出输出结果应该是:
    Integer Constructor
    before return
    Integer Copy Constructor
    Integer Copy Constructor
    但实际结果是:
    这里写图片描述
    原因是编译器自动优化的结果,只执行一次Copy Constructor来构造新的对象,不会再次调用Copy Constructor,以临时对象来构造新的对象。

    参考文献

    [1]Scott Meyers.More Effective C++(第三版)[M].北京:电子工业出版社,2011.1
    [2]http://www.cnblogs.com/daocaoren/archive/2011/07/19/2110258.html

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    ---转载或者使用代码,请注明原作者 This is bill
  • 相关阅读:
    4K
    4J
    4C
    I2C总线的仲裁机制
    Linux C中strcpy , strncpy , strlcpy 的区别
    Linux下的USB总线驱动(一)
    C/C++ 语言中的表达式求值
    const变量通过指针修改问题
    关于协议栈XDATA,内存溢出的小结
    Ubuntu安装ssh,及失败解决方案
  • 原文地址:https://www.cnblogs.com/ScytheWH/p/4622972.html
Copyright © 2011-2022 走看看