深拷贝和浅拷贝
浅拷贝: 其实大家可以理解为浅拷贝是一个高级的赝品。华强北都听说过吧,无论华强北生产手机的外形,ui做的如何像iphone,可是它终究不是iphone。浅拷贝还有另外一个名字,叫做等位拷贝。还是以手机为例吧,你iphone颜值高,我一摸一样的复制你,你iphone有传感器,我也复制过来,总之,你iphone有啥,我就有啥。
那为什么华强北生产出来的iphone不叫iphone呢?因为操作系统不一样,cpu也不一样,浅拷贝只是1:1对等的拷贝了表面上的东西,但是“内涵”它却没拷贝
如果你自己没有提供一个拷贝构造器的话,系统会自动帮你生成一个默认的构造器,系统默认提供的构造器就是一个浅拷贝。
浅拷贝
#include <iostream>
class Girl
{
public:
Girl(int age)
:age(age)
{
std::cout<<"构造器"<<std::endl;
};
~Girl(){
std::cout<<"析构造"<<std::endl;
};
// Girl(const Girl& another){
// std::cout<<"拷贝构造"<<std::endl;
// }
int getAge(){
return age;
}
private:
int age;
};
int main(int argc, char const *argv[])
{
Girl girl(18);
Girl girl2(girl); //发生了拷贝构造
std::cout<<"&gilr:"<<&girl<<" girl age:"<<girl.getAge()<<std::endl;
std::cout<<"&gilr2:"<<&girl2<<" girl2 age:"<<girl2.getAge()<<std::endl;
return 0;
}
构造器
&gilr:0x7ffeea794e28 girl age:18
&gilr2:0x7ffeea794e20 girl2 age:18
析构造
析构造
浅拷贝的后遗症
#include <iostream>
class Girl
{
public:
// Girl(int age,const char* s)
// :age(age)
// {
// name = new char[20];//申请了20个字节的空间
// strcpy(name,s);
// std::cout<<"构造器"<<std::endl;
// };
Girl(const char* s)
{
name = new char[20];//申请了20个字节的空间
strcpy(name,s);
std::cout<<"构造器"<<std::endl;
};
~Girl(){
if (name) {
delete name;
name = NULL;
}
std::cout<<"析构器"<<std::endl;
};
// Girl(const Girl& another){
// std::cout<<"拷贝构造"<<std::endl;
// }
int getAge(){
return age;
}
private:
int age;
char *name;
};
int main(int argc, char const *argv[])
{
Girl girl("Mary");
Girl girl2(girl);
return 0;
}
上述代码编译虽可以通过,但是运行时报错了,原因是进行了2次析构
a.out(88771,0x110fe0d40) malloc: *** error for object 0x7fb20ac025b0: pointer being freed was not allocated
a.out(88771,0x110fe0d40) malloc: *** set a breakpoint in malloc_error_break to debug
`
深拷贝
#include <iostream>
class Girl
{
public:
// Girl(int age,const char* s)
// :age(age)
// {
// name = new char[20];//申请了20个字节的空间
// strcpy(name,s);
// std::cout<<"构造器"<<std::endl;
// };
Girl(const char* s)
{
name = new char[20];//申请了20个字节的空间
strcpy(name,s);
std::cout<<"构造器"<<std::endl;
};
~Girl(){
if (name) {
delete this->name;
name = NULL;
}
std::cout<<"析构器"<<std::endl;
};
Girl(const Girl& another){
if (name)
delete name;
name = new char[20];
strcpy(name,another.name);
std::cout<<"拷贝构造"<<std::endl;
}
int getAge(){
return age;
}
private:
int age;
char *name;
};
int main(int argc, char const *argv[])
{
Girl girl("Mary");
Girl girl2(girl);
return 0;
}
构造器
拷贝构造
析构器
析构器