关于双目运算符重载

dengfei007 2009-04-25 10:54:14
#include <iostream>
#include <string>
using namespace std;
class Sting//注意这里String中的'S'是大写
{
private:
char *p;
int size;
public:
String();//建立一个空串
String(int sz);
String(char *str);//用C++串来初始化,注意char *str这里实际上就是str是一个串即是一个串对象
String(String &ob);//用串对象来初始化
~String(){delete []p;};
int strsize() {return strlen(p);}//注意这里的p是字符串对象
friend ostream & operator<<(ostream &stream,String & ob);
String operator +(String & ob);
String operator +(char *s);
friend String operator +(char * s,String & ob);)//问题在此!!!这里运算符重载为友元函数的参数有两个,我记得有个规定 第一个形参必须为是友元类的类型啊


};
String::String()
{
size=1;//用来存放结束标志NULL
p=new char[size];
if(p==NULL)
{cout<<"分配内存出错"<<endl;
exit(1);
}
p=NULL;
}
String::String(int sz)
{
size=sz;
p=new char[sz];
if(p==NULL)
{
cout<<"分配内存错误!"<<endl;
exit(1);
}

}
String::String(char *str)
{
size=strlen(str)+1;
p=new char[size];
if(p==NULL)
{
cout<<"分配内存错误"<<endl;
exit(1);
}
strcpy(p,str);
}
String::String(String & ob)
{
size=ob.size;
p=new char[size];
if(p==NULL)
{
cout<<"分配内存出错!"<<endl;
exit(1);
}
strcpy(p,ob.p);
}
ostream & operator <<(ostream & stream,String & ob)
{
stream<<ob.p;
return stream;
}
String String ::operator +(String & ob)
{
//两个串对象的连接
int len;
len=strlen(p)+srlen(ob.p)+1;
String temp(len);
strcpy(temp.p,p);
strcat(temp.p,ob.p);
return temp;
}
String String::operator +(char * s)
{
//一个串对象与一个带引号串的连接
int len;
len=strlen(s)+strlen(p)+1;
String temp(len);
strcpy(temp.p,p);
strcat(temp.p,s);
return temp;

}
String operator +(char * s,String & ob)//问题在此!!!这里运算符重载为友元函数的参数有两个,我记得有个规定 第一个形参必须为是友元类的类型啊
{
int len;
int len;
len=strlen(s)+strlen(p)+1;
String temp(len);
strcpy(temp.p,s);
strcat(temp.p,ob.p);
return temp;

}
请问下双目运算符重载为友元函数 这两个参数有什么规定吗???!!!
我看得<<c++程序设计语言>>中是这样写的:
"双目运算 p1+p2
对于双目运算符+,如果p1为A类的对象,则应当把+重载为A类的友元函数,该函数有两个形参,其中一个形参的类型是A类。经过重载之后,表达式p1+p2就相当于函数调用operator +(p1,p2)"
而我这个串类的定义和实现中的双目运算符重载为友元函数似乎不符合上面的要求啊
...全文
380 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengfei007 2009-04-26
  • 打赏
  • 举报
回复
还不是很清楚啊啊 谁能再讲的详细点 是我那本上上说的有错误???
lpf000 2009-04-26
  • 打赏
  • 举报
回复
bangding
sagegz 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dengfei007 的回复:]
还不是很清楚啊啊 谁能再讲的详细点 是我那本上上说的有错误???
[/Quote]
什么高级的书?
sherrik 2009-04-25
  • 打赏
  • 举报
回复
成员函数参数不能大于1,所以双目运算符更多的是用友员来实现,不过成员也可以实现,可以返回引用来解决参数问题
mengde007 2009-04-25
  • 打赏
  • 举报
回复
没有这个说法;楼主不要被人给蒙了;
  • 打赏
  • 举报
回复
运算符重载函数可以是类成员函数(如“+”左边必须是类),类友元函数(需要访问类私有成员时使用很方便),普通函数(访问类私有成员时不太方便)

双目运算符,没有说一定要作为成员函数啊。
hjjdebug 2009-04-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 dengfei007 的帖子:]
对于双目运算符+,如果p1为A类的对象,则应当把+重载为A类的友元函数,该函数有两个形参,其中一个形参的类型是A类。经过重载之后,表达式p1+p2就相当于函数调用operator +(p1,p2)"
而我这个串类的定义和实现中的双目运算符重载为友元函数似乎不符合上面的要求啊

。。。
String operator +(char * s,String & ob)//问题在此!!!这里运算符重载为友元函数的参数有两个,我记得有个规定 第一个形参必须为是友元类的类型啊
[/Quote]
你重载+操作符显然是为了让+操作符能够操作String 类型,
上面的代码,虽然p1 不是String, 但p2 是String, 所以可以,

甚至p1, p2都不是String, 也可以。
String operator +(char * s1,char * s2)
你重载了什么类型,+就按什么操作
nickyjay0501 2009-04-25
  • 打赏
  • 举报
回复
双目运算符重载为友元函数时,第一个参数是A类的对象(楼主里提到的),第二个参数是就是重载的运算符右边的那个了。
DaemonChen 2009-04-25
  • 打赏
  • 举报
回复
建议能用成员就不用友员

友员与成员的差别在:
(1)成员:参数不用传第一个操作数,受访问限制影响.
(2)友员:依次传递所有操作数,不受访问限制影响.
hjjdebug 2009-04-25
  • 打赏
  • 举报
回复
这个没有规定!
S_zxing 2009-04-25
  • 打赏
  • 举报
回复
先帮顶……

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧