*** 作符函数就是在重载 *** 作符的时候需要对 *** 作符进行重新定义的函数。
比如,要多+ *** 作符进行重新定义:
int operator +(int a,int b)
{
reurn a+b;
}
形式与实现过程与普通的函数非常相似,只是在使用时形势不大一样。
*** 作符:指令系统的每一条指令都有一个 *** 作符,它表示该指令应进行什么性质的 *** 作。不同的指令用 *** 作符这个字段的不同编码来表示,每一种编码代表一种指令。组成 *** 作符字段的位数一般取决于计算机指令系统的规模。
这句的意思,我理解是:你可以把运算符重载作为成员函数;或者做一个这个类的全局运算符重载函数。
区别:
如果是单目运算,只能用类内成员函数;
如果是双目运算,两者都可以。
不过全局的有个好处,在你做双目运算时,不用考虑那个在前,那个在后。
例子:
全局:
A operator+(const A& a1,const A& a2)
{
cout<<"test"<<endl;
int sum = a1data+a2data;
return A(sum);
}
如果是类内成员函数,双目运算符重载的话,参数就只有一个了。
大多数C++运算符可以重载。运算符重载是一种形式的C++多态。运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。
单目运算符重载:
单目运算符只有一个 *** 作数,如!a,-b,&c,p,还有最常用的++i和--i等。由于单目运算符只有一个 *** 作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。
下面以自增运算符”++“为例,介绍单目运算符的重载。
[例] 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0开始算。要求输出分和秒的值。
可以看到:在程序中对运算符“++”进行了重载,使它能用于Time类对象。“++”和“--”运算符有两种使用方式,前置自增运算符和后置自增运算符
针对“++”和“--”这一特点,C++约定,在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。
双目运算符重载:
双目运算符(或称二元运算符)是C++中最常用的运算符。双目运算符有两个 *** 作数,通常在运算符的左右两侧,如3+5,a=b,i<10等。在重载双目运算符时,不言而喻在函数中应该有两个参数。
[例] 定义一个字符串类String,用来存放不定长的字符串,重载运算符“==”、“<”和“>”,用于两个字符串的等于、小于和大于的比较运算。
有了这个基础后,再增加其他必要的内容。现在增加对运算符重载的部分。为便于编写和调试,先重载一个运算符“>”。程序如下:
程序运行结果为1。
这只是一个并不很完善的程序,但是,已经完成了实质性的工作了,运算符重载成功了。其他两个运算符的重载如法炮制即可。
。。。看来是初学者。。。
有几点建议:
1 把=重载成显示信息很不合理,毕竟=通常是用来赋值的。建议输出信息可以用成员函数代替。或者重载<<也可以。
2 既然重载了>,那么<也有必要重载下。
3 对于< == 等这类双目运算符重载的时候,如果定义为成员函数,通常是函数的都有一个此类型的形参的引用。
4 重载运算符的话,你最起码要在类里面声明下吧。
#include<iostream>
using namespace std;
class Date
{
public:
Date(){ month=01;day=01;}
Date(int m,int d){ month=m;day=d;}
void setDate(int m,int d);
void Display();
bool operator==(const Date &MyDate);
void operator>(const Date &MyDate);
private:
int month;
int day;
};
void Date::setDate(int m,int d)
{
month=m;
day=d;
}
bool Date::operator==(const Date &MyDate)
{
if(month == MyDatemonth && day == MyDateday)
return true;
else return false;
}
void Date::operator>(const Date &MyDate)
{
if(month > MyDatemonth)
cout<<"The first input date is bigger than later"<<endl;
else if(month == MyDatemonth)
{
if(day > MyDateday)
cout<<"The first date is bigger than later"<<endl;
else
cout<<"The first date is smaller than later"<<endl;
}
else
cout<<"The first date is smaller than later"<<endl;
}
void Date::Display()
{
cout<<"The Date is"<<month<<" "<<day<<endl;
}
int main()
{
return 0;
}
//否决了你重载=的想法,自己定义个函数输出吧。
//重载==没什么好说的,返回值bool型的。至于>的重载,其实是不太好重载的,毕竟Date有两个参数,理论上来说返回值最好也设置成为bool型的,这样比较合理。至于什么时候返回false,什么时候返回true,你自己修改下吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)