字符串类中运算符重载出现的一个问题

  上机辅导。学生的一个程序莫名出问题。她是在做一个String类,主要是要实现字符串的连接。
  程序是这样的,请读者将其拷到IDE,边看边调:

#include <iostream>
#include <cassert>
#include <cstring>
using namespace std;
class String
{
private:
    char* p;
    int len;
public:
    String();
    String(const char* s);
    String(const String& s);
    ~String();//问题出现在这儿
    void show();
    friend String operator+(const String& s1,const String& s2);
    friend String operator-(const String& s1,const String& s2);
};
String::String()
{
    len=0;
    p=NULL;
}
String::String(const char* s)
{
    len=strlen(s);
    p=new char[len+1];
    strcpy(p,s);
}
String::String(const String& s)
{
    len=s.len;
    if(p!=NULL)delete []p;
    p=new char[len+1];
    strcpy(p,s.p);
}
String operator+(const String& s1,const String& s2)
{
    String total;
    total.len=s1.len+s2.len;
    total.p=new char[total.len+1];
    strcpy(total.p,s1.p);
    strcat(total.p,s2.p);
    return total;
}
String operator-(const String& s1,const String& s2)
{
    char* c1=new char[s1.len+1];
    strcpy(c1,s1.p);
    int i=s1.len-1;
    while(s1.p[i]!=' '&&i>=0)--i;
    c1[i+1]='\0';
    char* c2=new char[s2.len+1];
    strcpy(c2,s2.p);
    i=0;
    while(i<s2.len&&c2[i]==' ')++i;
    int j=0;
    while(c2[i]!='\0'&&i<s2.len)
    {
        c2[j]=c2[i];
        ++i;
        ++j;
    }
    c2[j]='\0';
    String s;
    s.len=s1.len+s2.len;
    s.p=new char[s.len];
    strcpy(s.p,c1);
    strcat(s.p,c2);
    delete c1;
    delete c2;
    return s;
}
void String::show()
{
    cout<<p<<endl;
}
String::~String()
{
    delete []p;
}

int main()
{
    String str1("123"),str2("456"),str3;
    str3=str1+str2;
    str3.show();
    str3=str1-str2;
    str3.show();
    return 0;
}

  问题的表现是,str3.show();的输出是几个莫名的符号!
  我让她单步跟踪一下,却发现无论断点设在哪里,总是要进到析构函数~String()中去!
  恰其他同学的问题不少,我让她将这个程序给我发邮件,她不要在此纠缠。我清楚,这里有指针成员。祸水应该与此相关。
  学习越来越深入,学生出问题的程序,常需要仔细阅读后才能给指导意见了。
  午睡后,打开邮件。将程序拷入IDE,已经注意到了执行str3=str1+str2;时,需要有的赋值运算符=的重载。试图找一下单步时进入~String()时的场景,却未遂。
  在我的IDE下,str3=str1+str2;的结果正常,str3=str1-str2;的结果却异常。野指针的表征,真伪混杂最头疼。
  重载赋值运算=,在类声明中加:

    String &operator=(const String& s1);

  实现为:

String &String::operator=(const String &s1)
{
    if(!this->p)
        delete []p;
    p=new char(s1.len+1);
    strcpy(p,s1.p);
    len=s1.len;
    return *this;
}

  先向学生交作业。进入~String()的问题是否还在?暂时放下,待回音。

时间: 2024-10-15 09:07:07

字符串类中运算符重载出现的一个问题的相关文章

第8周-任务1-方案3-复数类中运算符重载(与实数运算)

接:第8周-任务1-方案2-复数类中运算符重载(非成员函数实现) 本文在方案2的基础上,扩展+.-.*./运算符的功能,使之能与double型数据进行运算.设Complex c; double d; c?d和d?c的结果为"将d视为实部为d的复数同c运算"的结果(其中?为+.-.*./之一).另外,再定义一目运算符 -,-c相当于0-c. [讲解视频] [参考解答] 在下面的解答中,我将所有二目运算符的重载定义为友元函数,一目运算符重载为成员函数,这是惯用的做法. #include &

第8周-任务1-方案2-复数类中运算符重载(非成员函数实现)

接:第8周-任务1-方案1-复数类中运算符重载(成员函数实现) 本文用方案二求解:用类的友元函数,而不是成员函数,完成上面提及的运算符的重载: [讲解视频] [参考解答] #include <iostream> using namespace std; class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} friend Complex operator+(Comp

第9周-任务2-Time类中运算符重载

[题目]接第8周任务2,定义Time类中的<<和>>运算符重载,实现时间的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然. [参考解答] #include <iostream> using namespace std; class CTime { private: unsigned short int hour; // 时 unsigned short int minute; // 分 unsigned short int second; // 秒 pub

第9周-任务3-分数类中运算符重载

[题目]接第8周任务3,定义分数类中<<和>>运算符重载,实现时间的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然. [参考解答] #include <iostream> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int nu=0,int de=1):nume(nu),deno(de){} void si

c++-C++ list赋值和类的运算符重载

问题描述 C++ list赋值和类的运算符重载 刚刚发现了个问题,一直卡着我 class CA { public: CA(){} ~CA(){} public: VOID operator = ( CA& msg ) { dwvalue = msg.dwvalue; } private: DWORD dwvalue; }; VOID Fuck1( OUT list& bb ) { list< CA > aa; CA a; CA b; aa.push_back(a); aa.pu

hashtable-关于C++中运算符重载的问题

问题描述 关于C++中运算符重载的问题 template HashTable&HashTable::Insert(const E&e) { //散列表插入 K k=e; //抽取key值 int b=hSearch(k); //检查是否能完成插入 if(empty[b]) { empty[b]=false; ht[b]=e; return *this; } 散列表中的插入操作,要往Insert()中传的e是string类型的,然后下面的K k=e中的K是int,想要把"=&quo

link中运算符重载必须依附于类型这个怎么理解?什么是运算符重载的类型?

问题描述 link中运算符重载必须依附于类型这个怎么理解?什么是运算符重载的类型? link中运算符重载必须依附于类型这个怎么理解?什么是运算符重载的类型? 解决方案 就是说,C++允许在类的定义外面定义运算符重载.你可以重载两个整数的加减.但是C#不允许,你不能改变现有类型的运算符,只能给你自己定义的类型重载运算符.

os-c++中运算符重载 这个小程序怎么不对呢

问题描述 c++中运算符重载 这个小程序怎么不对呢 #include using namespace std; class R{ public : int n; int d; R(int a,int b) { this->n=a; this->d=b; } }; ostream operator<< (ostream &os,R &r) { // os<<r.n<<endl; // os<<r.d<<endl;; os

c++-C++中运算符重载问题~~~~~

问题描述 C++中运算符重载问题~~~~~ 解决方案 参考这个:http://www.360doc.com/content/10/0828/10/352319_49373706.shtml 解决方案二: http://wuyuans.com/2012/09/cpp-operator-overload/http://blog.csdn.net/dingyuanpu/article/details/5852825 如需要具体代码,请采纳本回答. 解决方案三: #include #include st