fruit_cn 2013-12-25 04:06 采纳率: 0%
浏览 1830

范磊c++,在十八章写String类 “重载输入运算符” 遇到问题,请各位大侠帮忙指点!

#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以后程序就不会崩溃了,请问是什么原因呢?

  • 写回答

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),自己考虑吧

    评论

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名