c++引用容易出现的问题实例

c++引用容易出现的问题实例:

#include <iostream>
using namespace std;
class A
{
public :
A(int i){cout<<”执行构造函数创建一个对象\n”;x=i;}
A(A&a){x=a.x;cout<<”执行复制构造函数创建一个对象\n”;}
~A(){cout<<”执行析构函数!\n”;}
int get(){return x;}
private:
int x;
};
A func()
{
cout<<”跳转到func函数中!\n”;
A a(23);
cout<<”对象a的地址:”<<&a<<endl;
return a;
}
int main(){

A&r=func();
cout<<”对象a的副本的地址:”<<&r<<endl;
cout<<r.get()<<endl;
return 0;
}

这样呢就出现了一个问题,为什么对象a的副本的生命会一直持续到main函数结束呢?这是因为对于c++引用而言,如果引用是一个临时变量,那么这个临时变量的生存期就会不少于这个引用的生存期。也就是所,知道main函数结束时,引用r的生存期才结束,r所引用的临时变量的生存期才结束,由于r所引用的是一个对象,因此这时才调用它的析构函数释放内存。但是指针就没有这个特性,假如将对象a的副本的地址赋给一个指针,那么在func函数返回对象a的副本的时候,就可以析构扎个对象a的副本。

另外析构函数调用并析构某个对象后,知识告诉编译器这一块内存不再为某个对象独占了额,你可以访问它,别的对象或者变量也可以你访问它并使用该内存区域存储它们的数据,但是在它们使用之前。存放在该内存区域的数据并没有删除,因此使用指针访问该区域仍然能够得到未被修改的值。 本文链接地址: c++引用容易出现的问题实例