新微赢技术网

标题: C++运算符重载要点 [打印本页]

作者: 漫步烟雨中    时间: 2009-11-3 01:41
标题: C++运算符重载要点
我最近看了一本书,上面解释了运算符重载的要点以及用法注意事项,如下:
◆ 需要在定义的对象间相互赋值时,重载赋值运算符.
◆ 需要为数值类型增加算术属性时,重载算术运算符.
◆ 需要对定义的对象进行逻辑比较时,重载关系运算符.
◆ 如果重载了算术或关系运算符,应该考虑到算术运算和逻辑运算的可交换性(例如,按照重载的运算符计算,有A+B=C,那么务必包括其他运算符,使得B+A=C,C-B=A等等.同样如果有A>B,就要有B<A 和A!=B等等.)
◆ 对于容器类(container)类,重载下标运算符[ ].
◆ 需要从I/O流中读写对象时,重载插入运算符(<<)和析取运算符(>>).
◆ 重载成员指针运算符(->)以实现所谓的smart指针
◆ 在少数特殊的情况下,重载new和delete运算符.
◆ 不要重载其他的任何运算符.

重载的规则:
⒈ 重载的运算符不能违反语言的语言规则.例如,在C++里,下面的语句是不合法的:
int a;
/ a; //错误: / 不是一个单目运算符
因此,不能像下面这样重载/运算符:
Date dt(1,2,83);
/ dt; //错误: / 不是一个单目运算符
⒉ 如果一个运算符可以放在两个标识符中间,就可以重载他来满足累操作的需要,哪怕这种用法原先为编译器所不能接受.
让我们考虑如下的语句:
cout<<"Hello";
如果没有重载<<运算符,表达式的意思是把 std::cout按位左移有字符串的指针给出的位数,显然这无法通过编译器的语法检查.但是这个语句本身是正确的,在某种情况下可以用<<运算符把两个标识符分开.因为为满足这种需要,可以写一个重载运算符函数.当编译器看见重载的运算符出现在与之相关的两个数据类型之间时,就会调用重载的运算符函数.
⒊ 不能重载用与C++内部数据类型的运算符.例如,不能重载双目整数加法运算.
⒋ 不能自己创造C++语言不存在的运算符.例如,美元符号$不是C++中的运算符.因此就不可以用来重载.
⒌ 下列运算符是不可以被重载的:
◆ . 类成员运算符
◆ .* 成员指针运算符
◆ :: 域解析运算符
◆ ?: 条件表达式运算符
⒍ 不可以改变运算符的优先级.

写上面的这些是因为觉得解决了我对重载运算符的大部分疑惑,所以供大家一起分享,一起进步.
作者: 绝对标致    时间: 2009-11-3 01:41
正好我有个关于操作符等号的重载
#include<iostream>
using namespace std;
class parameter
{
int num1;
int num2;
public:
parameter(int c,int d){num1=c,num2=d;};
friend parameter operator=(parameter &s,parameter &p);
void disp(){cout<<num1<<" "<<num2<<endl;};
};
parameter parameter::operator=(parameter &s ,parameter &p)
{
s.num1=p.num1;
s.num2=p.num2;
return s;
}
void main()
{
parameter parameter1(2,3),parameter2(4,5);
parameter1=parameter2;
parameter1.disp();
}

错误提示是:
error C2801: 'operator =' must be a <Unknown> member
error C2511: '=' : overloaded member function 'class parameter (class parameter &,class parameter &)' not found in 'parameter'
这是为什么只能一个参数啊?我用了friend应该可以有两个参数吧?
作者: 52巧克力aiq    时间: 2009-11-3 01:41
你的错误信息是:
1. 'operator ='是一个未知成员.
2. 重载成员函数 'class parameter (class parameter &,class parameter &)'不在类 'parameter'中
作者: 飘林飞遥    时间: 2009-11-3 01:41
为什么要用友元重载?直接这样不可以吗?
#include<iostream>
using namespace std;
class parameter
{
int num1;
int num2;
public:
parameter(int c,int d){num1=c,num2=d;};
parameter & operator=(const parameter &p);
void disp(){cout<<num1<<" "<<num2<<endl;};
};
parameter & parameter::operator=(const parameter &p)
{
num1=p.num1;
num2=p.num2;
return *this;
}
int main()
{
parameter parameter1(2,3),parameter2(4,5);
parameter1=parameter2;
parameter1.disp();
system("pause");
return 0;
}
作者: 瘋子愛老婆    时间: 2009-11-3 01:41
可以的 不过我想知道我那哪儿错了?
作者: ...火狐狸```    时间: 2009-11-3 01:41
函数声明错误.
作者: ■.王锋◇    时间: 2009-11-3 01:41
以下是引用wfpb在2006-5-2 23:03:00的发言:
函数声明错误.
那错呢?
作者: 云飞    时间: 2009-11-3 01:41
重载操作符的定义没有吃透
'=' 重载只能是成员函数 而成员函数怎么能成为友员函数呢
但像'+='这类可以定义为非成员函数 当然可以成为友员函数来用啦
作者: 可爱的人    时间: 2009-11-3 01:41
'='不能友元啊?没看见书上说到,这位大哥能不能说具体点,哪些可以友元,哪些不行?
作者: FIFA2007    时间: 2009-11-3 01:41
以下是引用unicorn在2006-5-3 10:51:00的发言:
重载操作符的定义没有吃透
'=' 重载只能是成员函数 而成员函数怎么能成为友员函数呢
但像'+='这类可以定义为非成员函数 当然可以成为友员函数来用啦
'='不能是友元吗?那除了这个还有哪些不可以友元呢?




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2