浅复制
#include <iostream>
using namespace std;
class Test
{
private:
int x;
public:
Test(int n) {x=n; }
Test(const Test& c){x=c.x; }
void show (){cout<<x<<endl;}
};
int main()
{
Test a(100);
Test b(a);
Test c=a;
b.show();
c.show();
return 0;
}
有问题吗?
#include <iostream>
#include <cstring>
using namespace std;
class Test
{
private:
int x;
char *str;
public:
Test(int n, char *s)
{
x=n;
strcpy(str,s); //肇事地点,但不是祸端
}
Test(const Test& c)
{
x=c.x;
strcpy(str,c.str);
}
void show ()
{
cout<<x<<","<<str<<endl;
}
};
int main()
{
Test a(100,"Hello");
Test b(a);
a.show();
b.show();
b.show();
return 0;
}
正解——深复制
#include <iostream>
#include <cstring>
using namespace std;
class Test
{
private:
int x;
char *str;
public:
Test(int n, char *s)
{
x=n;
int m=strlen(s)+1;
str=new char[m];
strcpy(str,s);
}
Test(const Test& c)
{
x=c.x;
int m=strlen(c.str);
str=new char[m];
strcpy(str,c.str);
}
~Test()
{
delete str;
}
void show ()
{
cout<<x<<","<<str<<endl;
}
};
int main()
{
Test a(100,"Hello");
Test b(a);
a.show();
b.show();
b.show();
return 0;
}
最危险的修改——貌似对,但一定有机会错
#include <iostream>
#include <cstring>
using namespace std;
class Test
{
private:
int x;
char *str; //指针成员
public:
Test(int n, char *s){
x=n;
str=s; //不用strcpy(str,s);
}
Test(const Test& c){
x=c.x;
str=c.str;
}
void show (){
cout<<x<<","<<str<<endl;
}
};
int main()
{
Test *a;
a=new Test(100,"Hello");
Test b(*a);
a->show();
b.show();
delete a;
b.show();
return 0;
}