运算符的重载

【问题描述】不允许修改主函数,请将以下代码补充完整。
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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值