找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1228|回复: 9

C++运算符重载要点

[复制链接]
发表于 2009-11-3 01:41:30 | 显示全部楼层 |阅读模式 IP:江苏扬州
我最近看了一本书,上面解释了运算符重载的要点以及用法注意事项,如下:
◆ 需要在定义的对象间相互赋值时,重载赋值运算符.
◆ 需要为数值类型增加算术属性时,重载算术运算符.
◆ 需要对定义的对象进行逻辑比较时,重载关系运算符.
◆ 如果重载了算术或关系运算符,应该考虑到算术运算和逻辑运算的可交换性(例如,按照重载的运算符计算,有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:32 | 显示全部楼层 IP:江苏扬州
正好我有个关于操作符等号的重载
#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应该可以有两个参数吧?
回复

使用道具 举报

发表于 2009-11-3 01:41:35 | 显示全部楼层 IP:江苏扬州
你的错误信息是:
1. 'operator ='是一个未知成员.
2. 重载成员函数 'class parameter (class parameter &,class parameter &)'不在类 'parameter'中
回复

使用道具 举报

发表于 2009-11-3 01:41:40 | 显示全部楼层 IP:江苏扬州
为什么要用友元重载?直接这样不可以吗?
#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:45 | 显示全部楼层 IP:江苏扬州
可以的 不过我想知道我那哪儿错了?
回复

使用道具 举报

发表于 2009-11-3 01:41:48 | 显示全部楼层 IP:江苏扬州
函数声明错误.
回复

使用道具 举报

发表于 2009-11-3 01:41:51 | 显示全部楼层 IP:江苏扬州
以下是引用wfpb在2006-5-2 23:03:00的发言:
函数声明错误.
那错呢?
回复

使用道具 举报

发表于 2009-11-3 01:41:53 | 显示全部楼层 IP:江苏扬州
重载操作符的定义没有吃透
'=' 重载只能是成员函数 而成员函数怎么能成为友员函数呢
但像'+='这类可以定义为非成员函数 当然可以成为友员函数来用啦
回复

使用道具 举报

发表于 2009-11-3 01:41:54 | 显示全部楼层 IP:江苏扬州
'='不能友元啊?没看见书上说到,这位大哥能不能说具体点,哪些可以友元,哪些不行?
回复

使用道具 举报

发表于 2009-11-3 01:41:56 | 显示全部楼层 IP:江苏扬州
以下是引用unicorn在2006-5-3 10:51:00的发言:
重载操作符的定义没有吃透
'=' 重载只能是成员函数 而成员函数怎么能成为友员函数呢
但像'+='这类可以定义为非成员函数 当然可以成为友员函数来用啦
'='不能是友元吗?那除了这个还有哪些不可以友元呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 07:32 , Processed in 0.112564 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表