【问题描述】不允许修改主函数,请将以下代码补充完整。
class String {
char *ptr;
public:
String(char *s)
{
ptr=new char[strlen(s)+1];
strcpy(ptr, s);
}
~String() { delete []ptr; }
void print() { cout<<ptr<<endl; }
};
int main( )
{ String p1("book"), p2("pen"),p3("good"),p4;
p4 = p4 = p1 ;
p3 = p1 = p2;
cout<<"p2:";
p2.print();
cout<<"p1:"<<p1;
cout<<"p3:"<<p3;
p4+=p3;
cout<<"p4:"<<p4;
return 0;
}
【样例输入】
无
【样例输出】
p2:pen
p1:pen
p3:pen
p4:bookpen
#include<iostream>
using namespace std;
#include<cstring>
#include<stdio.h>
class String {
char *ptr;
friend ostream& operator<<(ostream& out,String r);
public:
String(char *s)
{
ptr=new char[strlen(s)+1];
strcpy(ptr, s);
//printf("%s\n",ptr);
}
String()
{
ptr=NULL;
}
~String() {
if(ptr!=NULL)
{
delete ptr;
ptr=NULL;
} }
void print() { cout<<ptr<<endl; }
String &operator=(const String &r)
{
if(&r==this)///为什么要判断这个
{
return *this;
}
else
{
int len=strlen(r.ptr);
ptr=new char[len+1];
strcpy(ptr,r.ptr);
return *this;}
}
//或者
//
//String& operator=(const String& rhs)
//{
std::cout << this << " CGoods::operator=(const CGoods&)" << std::endl;
// if (this != &rhs)//判断是否给自己赋值
// {
// delete[] ptr;//防止内存泄漏
// ptr = new char[strlen(rhs.ptr) + 1]();
//
// strcpy(ptr, rhs.ptr);
// }
// return *this;
//}
String &operator+=(String &r)
{
char *kk=ptr;
ptr=new char[strlen(ptr)+strlen(r.ptr)+1];/开辟新数组来储存
strcpy(ptr,kk);
strcat(ptr,r.ptr);
delete[] kk;//释放
return *this;
}
};
ostream &operator<<(ostream&out,String r)
{
out<<r.ptr<<endl;
return out;
}
int main( )
{ String p1("book"), p2("pen"),p3("good"),p4;
p4 = p4 = p1 ;
p3 = p1 = p2;
cout<<"p2:";
p2.print();
cout<<"p1:"<<p1;
cout<<"p3:"<<p3;
p4+=p3;
cout<<"p4:"<<p4;
return 0;
}
为什么要避免自赋值呢?
1)自己给自己赋值完全是毫无意义,为了效率。
2)如果类的数据成员中含有指针,自赋值有时会导致灾难性的后果。对于指针间的赋值,先要将p所指向的空间delete掉,然后再为p重新分配空间,将被拷贝指针所指的内容拷贝到p所指的空间。如果是自赋值,那么p和被拷贝指针是同一指针,在赋值操作前对p的delete操作,将导致p所指的数据同时被销毁
————————————————
原文链接:https://blog.csdn.net/zhangfei5354/article/details/89176163