文章目录
浅拷贝又称值拷贝,类中默认生成的拷贝构造函数使用的是浅拷贝eg:
class B
{
public:
B(int n1 = 0, int n2 = 0)
:_num1(n1), _num2(n2)
{}
B(const B &s)
{
_num1 = s._num1;
_num2 = s._num2;
}
private:
int _num1;
int _num2;
};
int main()
{
B s1(1,2);
B s2(s1);
}
浅拷贝只是将基本类型的值变的相同,但当遇到一些其他类型,默认的拷贝构造函数可能会出现问题
eg:
class A
{
public:
A(const char* str="")
:_str(new char[strlen(str)+1])
{
strcpy(_str, str);
}
~A()
{
delete[] _str;
_str = nullptr;
}
private:
char* _str;
};
int main()
{
A s1;
A s2(s1);
}
这里用默认拷贝构造函数
因为_str指向的是一块空间,如果用简单的值拷贝,s1与s2中的_str指向的是同一块空间的地址。

主函数结束后会调用析构函数,因为两对象中_str指向的空间相同,所以对相同空间连续析构两次导致程序崩溃。
所以这里的拷贝构造函数要先新开辟数组,在把值拷贝到新开辟的数组中。
A(const A&s)
:_str(new char[strlen(s._str)+1])
{
strcpy(_str, s._str);
}
与之相类的还有
=运算符的重载
也不能让其指向相同的空间,这里我们选择先将原来对象_str指向的空间释放掉,在新开辟一块与新对象_str相同大小的空间,再复制过去。
A& operator=(const A &s)
{
delete[]_str;
_str = new char[strlen(s._str) + 1];
strcpy(_str, s._str);
return *this;
}
本文探讨了浅拷贝的局限性,特别是在处理指针类型成员时可能导致的问题,并深入讲解了如何通过重载拷贝构造函数和赋等运算符实现深拷贝,确保对象间资源独立。实例演示了如何避免内存冲突和程序崩溃,关键在于正确管理内存分配和复制操作。
3051

被折叠的 条评论
为什么被折叠?



