一、浅拷贝问题
(1)如果类class中叧包含简单数据成员,没有指向堆的指针, 可以使用编译器提供的默认复制构造函数,但是这种情况很少。很多时候我们都会在头文件定义很多需要指向堆的指针。
如果发生浅拷贝等、默认复制构造函数等问题是极其危险的操作,会发生段错误,析构函数去两次释放同一个地址。
我的理解是浅拷贝是拷贝了对象的引用,因此地址不变。
int main()
{
{// 花括号让s1和s2变成局部对象,方便测试
String s1;
String s2(s1);// 复制对象,s1临时对象作为s2的参数去复制。这样会让里面的指针指向同一个地址。
//如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。
}
}
复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用。
(2)要解决浅拷贝问题,C++中引入了深拷贝。
深拷贝:
给每个对象独立分配资源,保证多个对象之间不会因共享资源而造成多次释放造成程序崩溃问题。
String(const String& s)//拷贝构造 参数是自己
:_str(new char[strlen(s._str) + 1]) //赋值列表开辟空间
{
strcpy(_str, s._str);
}
String& operator=(const String& s) //赋值运算符重载
{
if (this != &s)//防止自己给自己赋值
{
_str = new char[strlen(s._str) + 1]; //得到新