2个小时没有搞定!!!拷贝构造函数极为奇怪的问题,大虾们一定帮忙。
我在学习操作符重载和拷贝构造函数时出现了奇怪的问题,给出大家代码(有点长),希望高手能够解决。
/*
String.h 头文件
*/
class String
{
private:
char *str;
public:
String();
String(const char *str);
String(const String &s);
virtual ~String();
String operator +(const String &s);
String& operator =(const String &s);
char * c_str();
};
/*
String.cpp
*/
#include "String.h"
#include <string.h>
#include <iostream.h>
String::String()
{
str=new char[1];
strcpy(str,"\0");
cout<<"constructor:\t"<<this<<endl;
}
String::~String()
{
cout<<"destructor:"<<this<<endl;
delete str;
}
String::String(const char *str)
{
cout<<"param constructor:"<<this<<endl;
int len=strlen(str);
this->str = new char[len+1];
strcpy(this->str,str);
}
String::String(const String &s)
{
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
cout<<"copy constructor:"<<this<<endl;
}
String &String::operator =(const String &s)
{
cout<<"Assign opertor:"<<this<<endl;
delete str;
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
return (*this);
}
char * String::c_str()
{
return str;
}
String String::operator +(const String &s)
{
/* 此段代码在最后一句会调用拷贝构造函数,并且会导致错误
String tmp(str);
strcat(tmp.str,s.str);
return tmp;
*/
/* 此段代码不会调用拷贝构造函数,而且不会出错*/
char *temp=new char[strlen(str)+1];
strcpy(temp,str);
strcat(temp,s.str);
return String(temp);
}
/*
mainfile.cpp
*/
#include "String.h"
#include <iostream.h>
int main(int argc,char* argv[])
{
String s1("hello");
String s2(" world");
String s3;
s3=s1+s2; //注意:在这里出现错误。
cout<<s3.c_str()<<endl;
return 0;
}