对象的浅拷贝和深拷贝

一个类有多个对象,共享一套成员方法
成员方法如何知道操作哪个对象?
成员方法一经编译,方法参数前面添加一个this指针

堆stack 栈heap?

  1. 局部变量放栈上
  2. new delete等动态分配在堆上,堆就是一个动态分配的内存区域
  3. 全局变量 放数据段,生命周期为整个程序的开始到结束
1
2
3
4
5
6
7
8
9
10
11
int main()
{
SeqStack s; //无参数,默认构造默认析构
SeqStack s1(10);
SeqStack s2=s1; //拷贝构造,内存拷贝,
//浅拷贝
//s1析构出错
//等同SeqStack s3(s1);
}


20250302162332
s2析构先将地址释放,s1析构失败

对象默认的拷贝构造,(浅拷贝)是内存的数据拷贝
关键是对象若占用外部资源(指针指向外部内存),那么浅拷贝出现问题
因此,应该做深拷贝,为新对象也分配内存,再把内存数据拷贝过去,不能用默认的拷贝构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//需要自定义拷贝构造函数,深拷贝
SeqStack(const SeqStack& src)
{
_pstack= new int[src._size];
for (int i = 0; i < _size; i++)
{
_pstack[i]=src._pstack[i];
}
_top=src._top;
_size=src._size;

}


20250302162927

memcpy(),realloc() 都是浅拷贝,拷贝后指针指向的内存地址都一样


1
2
3
4
5
s2=s1;  //默认的赋值操作,
//做的是内存拷贝,s2指向s1
//s2。operator=(s1)
//void operator=(const SeqStack& src)

因此还要自定义赋值函数
```
//赋值重载函数,复制意味着已经有了定义对象
void operator=(const SeqStack& src) //这里参数为常引用,可以避免不必要的对象拷贝
//void operator=(SeqStack src);
// 按值传递,会触发拷贝构造函数
{
delete[] _pstack; //先释放当前对象占用的外部资源
if (this==&src)
return; //防止自己给自己赋值
_pstack= new int[src._size];
for (int i = 0; i < _size; i++)
{
_pstack[i]=src._pstack[i];
}
_top=src._top;
_size=src._size;
}