源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-08-24 18:05 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C++临时性对象的生命周期详细解析
[b]有关临时对象的生命周期有三种情况: 1)一般情况:[/b]临时性对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。 实例代码如下:
[u]复制代码[/u] 代码如下:
#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; }
运行结果为:
[img]http://files.jb51.net/file_images/article/201309/201309120939056.jpg[/img]
[b]2)[/b]凡含有表达式执行结果的临时性对象,应该存留到object的初始化操作完成为止。 示例代码如下:
[u]复制代码[/u] 代码如下:
#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; }
运行结果为: [img]http://files.jb51.net/file_images/article/201309/201309120939057.jpg[/img] [b]3)[/b]如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对象的生命范畴(scope)结束——视哪一种情况先到达而定。 示例代码如下:
[u]复制代码[/u] 代码如下:
#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; }
运行结果: [img]http://files.jb51.net/file_images/article/201309/201309120939058.jpg[/img]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部