using namespace" />

关于在String类中重载运算符后出现的程序崩溃问题

来源:互联网  时间:2016/8/26 19:34:46

关于网友提出的“ 关于在String类中重载运算符后出现的程序崩溃问题”问题疑问,本网通过在网上对“ 关于在String类中重载运算符后出现的程序崩溃问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 关于在String类中重载运算符后出现的程序崩溃问题
描述:

本人刚学C++不久,在学习编写String类的时候,jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播里边重载了各种运算符,有”=“、”<<“、”[ ]“、”>>“,也重载了构造函数及复制构造函数,但问题应该是出在”>>“或者"<<"又或者"[ ]"这三个的重载函数里,废话不多说,代码如下:
#include
using namespace std;
class String
{
public:
String();
String(const char*const p);
unsigned short int getlen()const{return len;}
char&operator[](unsigned short int a);
char operator[](unsigned short int a)const;
String(const String&rs);
~String(){cout<<"析构函数\n";}
String&operator=(const String&s);
friend ostream& operator<<(ostream &s,const String&a)
{ s<
friend istream& operator>>(istream &s,String&a)
{ s>>a.str; return s; }
private:
unsigned short int len;
char*str;
};
String::String()
{
cout<<"默认构造函数\n";
str=new char[1];
len=0;
str[0]='\0';
}
String::String(const char *p)
{
cout<<"带一个参数的构造函数\n"; len=strlen(p);
str=new char[len+1];
for(int i=0;i<>
{ str[i]=p[i]; }
str[len]='\0';
}
char& String::operator[](unsigned short int a)
{
cout<<"下标运算符函数执行\n";
if(a>len)return str[len-1];
else return str[a];
}
char String::operator[](unsigned short int a)const
{
cout<<"下标运算符const函数执行\n";
if(a>len)return str[len-1];
else return str[a];
}
String::String(const String&rs)
{
cout<<"复制构造函数\n";
 len=rs.len;
str=new char[len+1];
for(int i=0;i<>
{
str[i]=rs[i];
}
str[len]='\0';
}
String& String::operator=(const String&s)
{
cout<<"operator=在调用。。。\n";
if(this==&s)return *this;
delete[]str;
len=s.len;
str=new char[len+1];
for(int i=0;i<>
{
str[i]=s[i];
}
str[len]='\0';
return *this;
}
void main()
{
String a1("abcdefg");
String a2;
cin>>a2;
cout<<><>
a2=a1;
cout<<><>
}
问题描述:
        在build的时候程序是不会说错误的,运行后,在输入了a2的值后,程序就崩溃了,运行停留在下图所示的位置:
 关于在String类中重载运算符后出现的程序崩溃问题
就是程序显示:operator=在调用。。。    后就弹出了错误框。
如果把main函数中的 cin>>a2; 注释起来或者删去,运行就不会出现问题。
这是怎么回事???
求大神给个解答吧 关于在String类中重载运算符后出现的程序崩溃问题


解决方案1:

int main()
{
String a1("abcdefg");
String a2;
cin>>a2;   //这一步骤数组越界了
cout<<><>
}

解决方案2:

String::String()
{
cout<<"默认构造函数\n";
str=new char[10];
memset(str, 0 ,10*sizeof(char));
len=10;
str[9]='\0';
}
这样你试试 就可以了~~~
cin的时候 写数据就不会 出问题~~~

解决方案3:

String a2默认是一个空字符串,只有一字节是终止符,如果承受控制台输入的未知长度的字符串?

解决方案4:

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

上一篇c++ 问题 请大家帮忙看看
下一篇基类指针可以指向派生类对象,基类指针不能转换为派生类指针?
明星图片
相关文章
《 关于在String类中重载运算符后出现的程序崩溃问题》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)