c++程序,运行错误,求解!

2025-04-24 06:20:32
推荐回答(3个)
回答1:

首先指出其他同学的回答错误,当提供其他构造函数的时候,类不会提供默认构造函数,需要自己另外再提供,但是楼主的第一个构造函数:MyString ( char *s=0 )是有默认参数的,可以当作默认构造函数,因此不提供另外的默认构造函数也没有错。
其次,楼主的构造函数均有错误。在你的析构函数当中是这样写的:delete [] str; 而在你的2个构造函数中,当参数为空的时候,也就是这句:else str=0;处理不正确。应该这样处理:
if() ...
else
{
str = new char[1];
str[0] = '\0';
}
就是说构造一个空的对象的时候,依然要为其分配一个字节,然后以'\0'结束。而不是直接将成员str = 0,这表明指针为空,将在对象析构以及对成员计算长度(如:strlen(s.str))等操作的时候报错。
再次,你的重载+=操作符有逻辑错误。因为有可能是这样的情况:mystring s; s+=s; 就是说自己加自己的时候,那么使用你的重载操作符将出错。已经帮你修改好,如下:
MyString& operator += (MyString& s)
{
int len = strlen(this->str) + strlen(s.str) + 1; // 计算总长度
char * p = new char[len]; // 分配一个足以保存2个字符串的缓冲区

// 将2个字符串分别填入该缓冲区
strcpy(p, this->str);
strcat(p, s.str);

delete [] this->str; // 释放原来的内存

this->str = new char[len]; // 分配一个新的内存
strcpy(this->str, p); // 将缓冲区的数据填充到新内存中

delete [] p; // 释放缓冲区
return *this;
}

最后,提一点建议。
将你的构造函数的参数都应该加上const。
如:MyString ( const char *s=0 ) ,MyString ( const MyString& s )。
可以防止你在构造新对象的时候改变原来的数据。
还有在show函数后面加const,因为这个函数不会改变对象本身里面的数据。
void show() const
{
cout<}

回答2:

C中,只要自定义了构造函数,系统就不会给出默认构造函数了
楼上的,main函数头上有int,但函数体内无返回,应在大括号内最后加上return 0;

回答3:

MyString s4;
s3 += s2;
s4 += s2;

MyString 类无默认构造函数,所以s4对象不存在
s3无显式声明,无效变量。