4.重载双目运算符
class String
{
public:
String(){ p = NULL; } //定义默认构造函数
String(char* str); //声明构造函数
friend bool operator > (String &string1, String &string2);//声明运算符函数为友元函数
void display();
private:
char *p; //字符型指针,用于指向字符串
};
String::String(char* str)
{ p = str; }
void String::display()
{ cout << p; }
bool operator > (String &string1, String &string2)
{
if (strcmp(string1.p,string2.p) > 0)
{
return true;
}
else
{
return false;
}
}
Void compare(String &string1, String &string2)
{
if(operator >(string1,string2) > 0)
{
String1.display(); cout<<”>”; String2.display();
}
}
int main()
{
String string1("hello"), string2("Book");
compare(string1, string2);
return 0;
}
5.重载单目运算符
单目运算符(!a,-b,&c,*p,++i,–i等)只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。
例子:
class Time
{
public:
Time(){ min = 0; sec = 0; }
Time(int m,int s) : min(m),sec(s){}
Time operator ++ ();
void display(){ cout << min << ":" << sec; }
private:
int min;
int sec;
};
Time Time::operator++()
{
if (++sec >= 60)
{
sec -= 60;
++min;
}
return *this; //返回当前对象值
}
int main()
{
Time time1(34, 0);
for (int i = 0; i < 61;i++)
{
++time1; //运算符的操作数是一个对象,而且与运算符函数的类型相同
time1.display();
}
return 0;
}
问题:前置自增运算符和后置自增运算符,他们的作用是不一样的,在重载时怎么区分?
C++约定:在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。
如:
Time operator ++ (); //声明前置自增运算符“++”重载函数
Time operator ++ (int); //声明后置自增运算符“++”重载函数
例子:
class Time
{
public:
Time(){ min = 0; sec = 0; }
Time(int m, int s) : min(m), sec(s){}
Time operator ++ (); //声明前置自增运算符++重载函数
Time operator ++ (int); //声明后置自增运算符++重载函数
void display(){ cout << min << ":" << sec; }
private:
int min;
int sec;
};
Time Time::operator++()//前置自增运算符++重载函数
{
if (++sec >= 60)
{
sec -= 60;
++min;
}
return *this; //返回的是自加后的对象
}
Time Time::operator++(int) //后置自增运算符++重载函数
{
Time temp(*this);
sec++;
if (sec >= 60)
{
sec -= 60;
++min;
}
return temp; //返回的是自加前的对象
}
int main()
{
Time time1(34, 59),time2;
time1.display(); //34:59
++time1;
time1.display(); //35:0
time2 = time1++; //将自加前的对象的值赋值给time2
time1.display(); //35:1
time2.display(); //35:0
return 0;
}