文章目录
浅拷贝又称值拷贝,类中默认生成的拷贝构造函数使用的是浅拷贝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;
}