C++临时对象的生命周期举例分析

这篇文章主要介绍“C++临时对象的生命周期举例分析”,在日常操作中,相信很多人在C++临时对象的生命周期举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++临时对象的生命周期举例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

公司主营业务:成都网站制作、成都网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出方山免费做网站回馈大家。

1)一般情况:临时性对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。

例:

#include
using namespace std;

class A
{
public:
    A(int i): m_i(i)
    {
        cout << "A(): " << m_i << endl;
    }

    ~A()
    {
        cout << "~A(): " << m_i << endl;
    }

    A operator+(const A& rhs)
    {
        cout << "A operator+(const A& rhs)" << endl;
        return A(m_i + rhs.m_i);
    }

    int m_i;
};

int main()
{
    A a1(1), a2(2);
    a1 + a2;
    cout << "------------------------------------" << endl; //运行到这里,a1 + a2产生的临时变量已经被释放
    return 0;
}

运行结果:
A(): 1
A(): 2
A operator+(const A& rhs)
A(): 3
~A(): 3
------------------------------------
~A(): 2
~A(): 1

两个例外:
2)凡含有表达式执行结果的临时性对象,应该存留到object的初始化操作完成为止。

例:

#include
using namespace std;

class A
{
public:
    A(int i = 0): m_i(i)
    {
        cout << "A(): " << m_i << endl;
    }

    ~A()
    {
        cout << "~A(): " << m_i << endl;
    }

    A operator+(const A& rhs)
    {
        cout << "A operator+(const A& rhs)" << endl;
        return A(m_i + rhs.m_i);
    }

    A& operator=(const A& rhs)
    {
        cout << "A& operator=(const A& rhs)" << endl;
        m_i += rhs.m_i;
        return *this;
    }

    int m_i;
};

int main()
{
    A a1(1), a2(2);
    A a3;
    a3 = a1 + a2; //a1 + a2产生的临时变量在a3的赋值操作完成后,才释放
    return 0;
}

运行结果:
A(): 1
A(): 2
A(): 0
A operator+(const A& rhs)
A(): 3
A& operator=(const A& rhs)
~A(): 3
~A(): 3
~A(): 2
~A(): 1

3)如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对象的生命范畴(scope)结束——视哪一种情况先到达而定。

例:

#include
using namespace std;

class A
{
friend ostream& operator<<(ostream& os, const A&);
public:
    A()
    {

    }

    A(const A&)
    {
        cout << "A(const A&)" << endl;
    }

    ~A()
    {
        cout << "~A()" << endl;
    }
};

ostream& operator<<(ostream& os, const A&)
{
    os << "ostream& operator<<(ostream& os, const A&)" << endl;
    return os;
}

const A& f(const A& a)
{
    return a;
}

int main(int argc, char* argv[])
{
    {
        const A& a = A();
        cout << "-------------------" << endl;
    }//直到被初始化之reference的生命结束
       
    cout  << f(A()) << endl; //直到临时对象的生命范畴(scope)结束:
                             //临时对象的const引用在f的参数上(而不是返回值)。
                             //这个引用在f()返回的时候就结束了,但是临时对象未必销毁。
    cout << "-------------------" << endl;
   
    return 0;
}

运行结果:
-------------------
~A()
ostream& operator<<(ostream& os, const A&)

~A()

到此,关于“C++临时对象的生命周期举例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


当前标题:C++临时对象的生命周期举例分析
本文地址:http://pwwzsj.com/article/jcdphp.html