| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2368 人关注过本帖
标题:C++运算符重载要点
只看楼主 加入收藏
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
 问题点数:0 回复次数:14 
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++中的运算符.因此就不可以用来重载.
⒌ 下列运算符是不可以被重载的:
◆ . 类成员运算符
◆ .* 成员指针运算符
◆ :: 域解析运算符
◆ ?: 条件表达式运算符
⒍ 不可以改变运算符的优先级.

写上面的这些是因为觉得解决了我对重载运算符的大部分疑惑,所以供大家一起分享,一起进步.

[此贴子已经被作者于2006-5-2 20:13:43编辑过]

搜索更多相关主题的帖子: 运算符 要点 重载 算术 
2006-05-02 20:13
freshman42
Rank: 1
等 级:新手上路
威 望:1
帖 子:94
专家分:0
注 册:2005-12-4
收藏
得分:0 

正好我有个关于操作符等号的重载
#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应该可以有两个参数吧?

[此贴子已经被作者于2006-5-2 21:32:26编辑过]


2006-05-02 21:26
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

你的错误信息是:
1. 'operator ='是一个未知成员.
2. 重载成员函数 'class parameter (class parameter &,class parameter &)'不在类 'parameter'中


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-02 22:44
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
为什么要用友元重载?直接这样不可以吗?
#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;
}

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-02 22:52
freshman42
Rank: 1
等 级:新手上路
威 望:1
帖 子:94
专家分:0
注 册:2005-12-4
收藏
得分:0 
可以的 不过我想知道我那哪儿错了?

2006-05-02 22:59
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
函数声明错误.

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-02 23:03
freshman42
Rank: 1
等 级:新手上路
威 望:1
帖 子:94
专家分:0
注 册:2005-12-4
收藏
得分:0 
以下是引用wfpb在2006-5-2 23:03:00的发言:
函数声明错误.

那错呢?


2006-05-03 08:11
unicorn
Rank: 4
等 级:贵宾
威 望:14
帖 子:1066
专家分:0
注 册:2005-10-25
收藏
得分:0 
重载操作符的定义没有吃透
'=' 重载只能是成员函数 而成员函数怎么能成为友员函数呢
但像'+='这类可以定义为非成员函数 当然可以成为友员函数来用啦

unicorn-h.spaces. ◇◆ sava-scratch.spaces.  noh enol ! pue pu!w hw u! shemle aq ll!m noh 
2006-05-03 10:51
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
'='不能友元啊?没看见书上说到,这位大哥能不能说具体点,哪些可以友元,哪些不行?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-03 12:08
freshman42
Rank: 1
等 级:新手上路
威 望:1
帖 子:94
专家分:0
注 册:2005-12-4
收藏
得分:0 
以下是引用unicorn在2006-5-3 10:51:00的发言:
重载操作符的定义没有吃透
'=' 重载只能是成员函数 而成员函数怎么能成为友员函数呢
但像'+='这类可以定义为非成员函数 当然可以成为友员函数来用啦

'='不能是友元吗?那除了这个还有哪些不可以友元呢?


2006-05-03 12:37
快速回复:C++运算符重载要点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012879 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved