欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

C++临时性对象的生命周期详细解析

时间:2020-10-11 10:44:50|栏目:C代码|点击:
有关临时对象的生命周期有三种情况:

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

实例代码如下:
复制代码 代码如下:

#include <iostream>
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;
}

运行结果为:



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

复制代码 代码如下:

#include <iostream>
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;
}


运行结果为:




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

示例代码如下:
复制代码 代码如下:

#include <iostream>
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;
}

运行结果:

上一篇:C++设计模式之外观模式

栏    目:C代码

下一篇:C++设计类不能被继承的方法实例讲解

本文标题:C++临时性对象的生命周期详细解析

本文地址:http://www.codeinn.net/misctech/9695.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有