小众知识

首页 > 正文

请问对于一个包含指针数据成员的类如何重载“+”这样的运算符?谢谢

如题,偶刚学C++,刚接触到重载问题,麻烦大家教一教偶。

999999999999

THX  

 jjzhk 发表于:2003-07-22 17:22:33
得分:0 

具体一点,ok? 

 Ashela 发表于:2003-07-22 21:12:56
得分:0 

#include 
#include 
class sample
{
char *p;
public:
sample()
{
p=new char[1];
strcpy(p,"");
}
sample(char *n)
{
p=new char[strlen(n)+1];
strcpy(p,n);
}
sample &operator =(sample &s)
{
        delete p;
p=new char[strlen(s.p)+1];
strcpy(p,s.p);
return (*this);
}
sample operator +(sample s)
{
char *str;
str=strcat(p,s.p);
return sample(str);
}
void display()
{
cout<}
~sample()
{
delete p;
}
};
void main()
{
sample a("first"),b("second"),c;
a.display();
b.display();
cout<c=a+b;
c.display();
}
编译已通过,但运行时出错,错误提示和空指针错误是一样的。
再次THX~~~~~~~ 

 laomai 发表于:2003-07-22 22:11:36
得分:0 

我的思路(自己想的,不过应该没什么问题)
sample operator +(const sample& s)
{
  int n=strlen(this.p)+sizeof(s.p)+1;  //为'\0'留出位置 
  char *temp =  new char[n];         
  strcpy(temp,this.p);
  strcat(temp,s.p);
  delete p;    // 这句很重要;并且注意一定在下一句之前
  p=temp;      
}  


}

 laomai 发表于:2003-07-22 22:12:51
得分:0 

还少了最后一句,return *this; 

 gernal_dn 发表于:2003-07-23 00:59:28
得分:0 

另外,已经有了sample(char *n)构造函数,这意味着可以作 sample + (char*)的加法,
因此最好将operator + 声明为友函数。

 callzjy 发表于:2003-07-23 01:07:39
得分:20 

#include
#include

class string
{
public:
char* str;
public:
string(){str =new char[1];}          //缺省构造函数
~string(){delete []str;}              //加入析构函数

string(char*s)                       //构造函数
{
str=new char[strlen(s)+1];
strcpy(str,s);
}

string(const string&s)               //拷贝构造函数
{
// if(str)
//        delete[]str;                 //多余的判断,因为拷贝构造函数永远不会复制自身
//
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
cout<<"调用拷贝构造函数"<}

string& operator=(const string&s)    //重载等号运算符
{
if(this != &s)                   //请加入此语句,防止自身赋值
{
if(str)
delete[]str;
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
}
return *this;
}

    friend string operator+(const string&,const string&);//重载加号运算符
};

string operator+(string&s1,string&s2)//返回为对象,不是引用类型,注意会调用拷贝构造函数
{

int len1=strlen(s1.str),len2=strlen(s2.str);
string temp;
        temp.str=new char[len1+len2+1];
strcpy(temp.str,s1.str);
strcat(temp.str,s2.str);

return temp;//会调用析构函数,之后,又会调用拷贝构造函数

}

void main()
{
string s1("aaaa");
cout<string s2("bbbb");
cout<string s3;
s3=s1+s2;             
cout<cout<cout<

上一篇:在c++中怎样用winsock在两台计算机间传输文件?
下一篇:类型转换得到的奇怪的结果,高手帮我解释一下。

分享到: