0
点赞
收藏
分享

微信扫一扫

C++语言基础 例程 深复制

琛彤麻麻 2022-03-17 阅读 55



浅复制

#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;
}




举报

相关推荐

0 条评论