浅拷贝概念以及产生的问题
类和对象的使用:
一个类的对象可以赋值,指针或者引用的形式作为函数的参数或返回值,一般情况下,为了避免创建临时对象通常传对象的引用,并且为了避免在函数体内修改对象的值,通常使用常引用;
const Point middle(const Point& p1,const Point& p2);
如果函数以传值形式返回一个类,编译器会创建一个临时对象来保存这个值;但有些编译器会做些优化。
浅拷贝:可以把一个对象赋值另一个对象,对象的每个成员的值,将1对1的拷贝到新的对象,这种拷贝叫做逻辑拷贝或者浅拷贝;
注意:如果对象含有指针成员变量,而指针成员变量又指向堆上内存,将只拷贝指针成员变量本身的值,造成两个对象的指针指向同一块堆上的内存空间,删除对象将造成二次删除;
eg:
#include <iostream>
using namespace std;
class Test
{
public:
Test()
{
pvar=new int[5];
for(int i=0;i<5;i++)
{
pvar[i]=i;
}
}
void print()
{
for(int i=0;i<5;i++)
{
cout<<pvar[i]<<" ";
}
cout<<endl;
}
~Test()
{
delete []pvar;
pvar=NULL;
}
private:
int *pvar;
};
int main()
{
Test(t1);
Test(t2);
t1.print();
t2.print();
t1=t2;//问题代码 二次删除---把t2赋值给了t1,所以t1和t2都指向得是t2的内存空间,同时也被释放两次
return 0;
}