64,642
社区成员
发帖
与我相关
我的任务
分享
//string2.h
#ifndef STRING2_H_
#define STRING2_H_
#include <iostream>
#pragma once
class string2
{
char * str;
int len;
static const int CINLIM=80;
public:
string2();
string2(const char *s);
string2(const string2 &);
~string2();
string2 & operator=(const string2 &);
string2 & operator=(const char *);
friend string2 operator+(const char *,const string2 & a);
friend string2 operator+(const string2 &s,const string2 & a);
friend std::ostream & operator<<(std::ostream & os,const string2 & s);
friend std::istream & operator>>(std::istream & is,string2 & s);
};
#endif
#include "string2.h"
#include <cstring>
string2::string2()
{
len=1;
str=new char[len+1];
str[1]='c';
}
string2::string2(const char *s)
{
len=strlen(s);
str=new char[len+1];
strcpy(str,s);
}
string2::string2(const string2 & s)
{
len=s.len;
str=new char[len+1];
strcpy(str,s.str);
}
string2::~string2()
{
delete [] str;
}
string2 operator+(const char *s,const string2 & a)
{
string2 sum;
sum.str=new char [strlen(s)+1];//这里面有问题,如果我直接写sum=new char[strlen(s)+1],编译能通过,而换成程序中写的编译就通不过了
strcpy(sum.str,s);
strcat(sum.str,a.str);
sum.len=strlen(sum.str);
return sum;
}
string2 operator+(const string2 & s,const string2 & a)//前面的析构函数和构造函数几乎和书上的一样都没有改动,后面的几个重载函数都单独试验过了并没有问题
{
string2 sum;
sum.str=new char [strlen(s.str)+1];
strcpy(sum.str,s.str);
strcat(sum.str,a.str);
return sum;
}
string2 & string2::operator=(const string2 & s)
{
if(this==&s)
return *this;
delete [] str;
len=s.len;
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
return *this;
}
string2 & string2::operator=(const char *s)
{
delete [] str;
len=strlen(s);
str=new char[len+1];
strcpy(str,s);
return *this;
}
std::ostream & operator<<(std::ostream & os,const string2 &s)
{
os<<s.str;
return os;
}
std::istream & operator>>(std::istream & is, string2 &s)
{
char temp[string2::CINLIM+1];
is.get(temp,string2::CINLIM);
if(is)
s=temp;
while(is&&is.get()!='\n')
continue;
return is;
}
//主函数
#include <iostream>
using namespace std;
#include "string2.h"
int main()
{
string2 s1(" and I am a C++ student.");
string2 s2="Please enter your name: ";
string2 s3;
cout<<s2;
cin>>s3;
s2="My name is "+s3;
s2=s2+s3;
return 0;
}
s2=s2+s3;
该行代码调用了类string2的重载+操作符,而该操作符的定义为
string2 operator+(const string2 & s,const string2 & a)//前面的析构函数和构造函数几乎和书上的一样都没有改动,后面的几个重载函数都单独试验过了并没有问题
{
string2 sum;
sum.str=new char [strlen(s.str)+1];
strcpy(sum.str,s.str);
strcat(sum.str,a.str);
return sum;
}
重载+操作符函数中,没有为sum的len赋值,此时len的值仍然是1,所以在函数返回时调用string2类的拷贝构造函数
string2::string2(const string2 & s)
{
len = s.len;
str = new char[len + 1];
strcpy_s(str, len + 1,s.str);
}
时,str的内存大小为len+1,len的值是1,所以str的大小仅为2,所以在调用strcpy进行拷贝时会报错。
2 问题解决
在重载+操作符中添加对sum.len的赋值
string2 operator+(const string2 & s, const string2 & a)//前面的析构函数和构造函数几乎和书上的一样都没有改动,后面的几个重载函数都单独试验过了并没有问题
{
string2 sum;
sum.str = new char[strlen(s.str) + a.len+ 1];
strcpy_s(sum.str, strlen(s.str) + 1,s.str);
strcat_s(sum.str, strlen(s.str) + a.len+1, a.str);
sum.len = strlen(sum.str);//添加对sum.len的赋值
return sum;
}
3 相关资料
C++中运算符的重载
http://blog.csdn.net/hou09tian/article/details/78024780
C++中拷贝构造函数与拷贝赋值操作符
http://blog.csdn.net/hou09tian/article/details/77483175