#include
using namespace std;
class String
{
public:
String();
String(char*);
String(String&);
virtual ~String(){cout<<"析构函数执行\n";delete []str;len=0;}
const int getlen()const{return len;}
friend ostream& operator<<(ostream&o,String &s)
{
o<
return o;
}
friend istream& operator>>(istream&i,String &s)
{
i>>s.str;
return i;
}
char &operator;
String & operator=(String&);
String & operator=(char );
private:
int len;
char *str;
};
String::String()
{
cout<<"不带参数的构造函数执行\n";
len=0;
str=new char[1];
str[0]='\0';
}
String::String(char*ch)
{
cout<<"带一个参数的构造函数执行\n";
len=strlen(ch);
str=new char[len+1];
for (int i=0;i<len;i++)
{
str[i]=ch[i];
}
str[len]='\0';
}
String::String(String&s)
{
cout<<"复制构造函数执行\n";
len=s.getlen();
str=new char[len+1];
for (int i=0;i<len;i++)
{
str[i]=s.str[i];
}
str[len]='\0';
}
char &String::operator
{
cout<<"operator[]函数执行\n";
if (len<length)
{
return str[len-1];
}
return str[length];
}
String & String::operator=(String&s)
{
cout<<"operator=函数执行\n";
delete []str;
len=s.getlen();
str=new char[len+1];
for (int i=0;i<len;i++)
{
str[i]=s.str[i];
}
str[len]='\0';
return *this;
}
String & String::operator=(char*ch)
{
cout<<"operator=char函数执行\n";
delete []str;
len=strlen(ch);
str=new char[len+1];
for (int i=0;i<len;i++)
{
str[i]=ch[i];
}
str[len]='\0';
return *this;
}
int main() **strong text*
{
String s;
cin>>s;
cout<<s<<endl;
cout<<s.getlen()<<endl;
return 0;
}
运行到结尾的时候,输出了我输入的字符,然后输出s.getlen(字符长度)的时候并不是我输入的字符长度,并且程序运行到这里后就崩溃了,当删除掉析构函数里的delete []str以后程序就不会崩溃了,请问是什么原因呢?
范磊c++,在十八章写String类 “重载输入运算符” 遇到问题,请各位大侠帮忙指点!
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- mevip 2013-12-25 04:36关注
1、String s;相当于调用了下面的构造函数
String::String()
{
cout<<"不带参数的构造函数执行\n";
len=0;
str=new char[1];
str[0]='\0';
}注意:此时,len=0; str只分配了一个字节。
2、cin>>s;会调用下面的函数:
friend istream& operator>>(istream&i,String &s)
{
i>>s.str;
return i;
}
含义是将标准输入(你从键盘输入的内容)写到str指向的内存区域;3、问题:str实际只分配了一个字节的内存,用于存储字符串结束符(\0),但你从键盘输入的字符串会存入str指向的内存;除非你在输入时直接回车(不输入任何字符),否则内容就会占用str已分配的内存区域后面的内存,导致崩溃。而且不管你输入多少字符,长度输出应该始终是0
4、解决办法:修改friend istream& operator>>(istream&i,String &s),自己考虑吧
解决 无用评论 打赏 举报
悬赏问题
- ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
- ¥15 如何在scanpy上做差异基因和通路富集?
- ¥20 关于#硬件工程#的问题,请各位专家解答!
- ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
- ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
- ¥30 截图中的mathematics程序转换成matlab
- ¥15 动力学代码报错,维度不匹配
- ¥15 Power query添加列问题
- ¥50 Kubernetes&Fission&Eleasticsearch
- ¥15 報錯:Person is not mapped,如何解決?