Code Bye

类用友元重载+时遇到的问题

#include<iostream.h>
#include<string>
class Str
{
int length;
char *p;
public:
Str()
{
p=new char[100];
}
Str(char *s)
{
p=new char [100];
strcpy(p,s);
}
Str(const Str &obj)
{
p=obj.getp();
}
~Str()
{
delete []p;
}
friend Str operator+(const Str &s1,const Str &s2);
void operator =(const Str &obj);
char* getp()const
{
return p;
}
void setp(char *s)
{
strcpy(p,s);
}
void show()
{
length=strlen(p);
cout<<“length=”<<length<<” “<<p<<endl;
}
};
Str operator + (const Str &s1,const Str &s2)  //报错处
{
Str temp;
strcpy(temp.getp(),s1.getp());
strcat(temp.getp(),s2.getp());
return temp;
}
void Str::operator =(const Str &obj)
{
strcpy(p,obj.getp());
}
int main()
{
char s1[100],s2[100];
cin.getline(s1,100);
cin.getline(s2,100);
Str A(s1);
Str B(s2);
Str C;
C=A+B;
C.show();
return 0;
}
解决方案

3

拷贝构造函数写的不对。得new出字符串 之后再strcpy

16

拷贝构造里没有给p分配空间,导致析构出错
PS:其实假如改成release的话(编译器优化过的话是不会调用拷贝构造的,也就不会报错)
#include<iostream>
#include<string>
using namespace std;
class Str
{
	int length;
	char *p;
public:
	Str()
	{
		p=new char[100];
	}
	Str(char *s)
	{
		p=new char [100];
		strcpy(p,s);
	}
	Str(const Str &obj)
	{
		p=new char [100];
		strcpy(p,obj.getp());
	}
	~Str()
	{
		delete []p;
	}
	friend Str operator+(const Str &s1,const Str &s2);
	void operator =(const Str &obj);
	char* getp()const
	{
		return p;
	}
	void setp(char *s)
	{
		strcpy(p,s);
	}
	void show()
	{
		length=strlen(p);
		cout<<"length="<<length<<" "<<p<<endl;
	}
};
Str operator + (const Str &s1,const Str &s2)  //报错处
{
	Str temp;
	strcpy(temp.getp(),s1.getp());
	strcat(temp.getp(),s2.getp());
	return temp;
}
void Str::operator =(const Str &obj)
{
	strcpy(p,obj.getp());
}
int main()
{
	char s1[100],s2[100];
	cin.getline(s1,100);
	cin.getline(s2,100);
	Str A(s1);
	Str B(s2);
	Str C;
	C=A+B;
	C.show();
	return 0;
}

18

引用:
Quote: 引用:
Quote: 引用:

但本人明明在构造函数中都已经new了啊,怎么拷贝构造中还是要再new一次?
假如本人的头文件不是<iostream.h>,就会显示本人的重载运算符+这一步不明确

题主应该看看什么是拷贝构造。

拷贝构造函数本质上就是构造函数,也就是说在调用拷贝构造时不再调用本人所定义的构造,自然也就没有new这一步骤;假如本人的理解有错误的地方欢迎指出!

构造函数是构造一个新的对象,你之前分配的内存是属于原对象,故你需要重新分配内存


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明类用友元重载+时遇到的问题