重载双目运算符
1、将< 运算符的重载变成友元函数。
2、注意运算符重载的定义规则,见类学习七。
3、字符串不能直接比较大小,必须用strcmp函数。
4、字符串比较大小不是哪个长哪个就大,而是从第一位比较,哪个ascii码大,哪个就大,和长度无关。
5、bool类型的输出true是1,false为0。
#include <iostream>
using namespace std;
class String
{
public:
String();
String(char *str);
void display();
friend bool operator < (String & str1,String &str2);
private:
char *p;
};
String::String(char* str)
{
p = str;
}
void String::display()
{
cout << p;
}
bool operator < (String & str1, String & str2)
{
if (strcmp(str1.p , str2.p) < 0) //字符串不能直接比较大小,必须用strcmp
{
return true; //输出为1,代表是正确的
}
else
{
return false;
}
}
int main()
{
String str1("hello"), str2("helloe");
str1.display();
cout << endl;
str2.display();
cout << endl;
cout <<(str1 < str2)<<endl;
system("pause");
return 0;
}
运行结果:
拓展到三个运算符:< , > ,==
#include <iostream>
using namespace std;
class String
{
public:
String();
String(char *str);
void display();
friend bool operator < (String & str1,String &str2);
friend bool operator > (String & str1, String &str2);
friend bool operator == (String & str1, String &str2);
private:
char *p;
};
String::String(char* str)
{
p = str;
}
void String::display()
{
cout << p;
}
//----------------------重载<-------------------------------
bool operator < (String & str1, String & str2)
{
if (strcmp(str1.p , str2.p) < 0) //字符串不能直接比较大小,必须用strcmp
{
return true; //输出为1,代表是正确的
}
else
{
return false;
}
}
//-------------------------重载>-----------------------------
bool operator > (String & str1, String & str2)
{
if (strcmp(str1.p, str2.p) > 0) //字符串不能直接比较大小,必须用strcmp
{
return true; //输出为1,代表是正确的
}
else
{
return false;
}
}
//------------------------重载==-------------------------------------
bool operator == (String & str1, String & str2)
{
if (strcmp(str1.p, str2.p) == 0) //字符串不能直接比较大小,必须用strcmp
{
return true; //输出为1,代表是正确的
}
else
{
return false;
}
}
//-----------------------------------------------------
int main()
{
String str1("hello"), str2("bookoo");
str1.display();
cout << endl;
str2.display();
cout << endl;
cout <<(str1 < str2)<<endl;
cout << (str1 > str2) << endl;
cout << (str1 == str2) << endl;
system("pause");
return 0;
}
运行结果:
这样的程序看起来不是很直观,不像是比较大小的,所以为了增加直观性,加一个显示直观的函数即可:
#include <iostream>
using namespace std;
class String
{
public:
String();
String(char *str);
void display();
friend bool operator < (String & str1, String &str2);
friend bool operator > (String & str1, String &str2);
friend bool operator == (String & str1, String &str2);
private:
char *p;
};
String::String(char* str)
{
p = str;
}
void String::display()
{
cout << p;
}
//----------------------重载<--------------------------------------------------------
bool operator < (String & str1, String & str2)
{
if (strcmp(str1.p, str2.p) < 0) //字符串不能直接比较大小,必须用strcmp
{
return true; //输出为1,代表是正确的
}
else
{
return false;
}
}
//-------------------------重载>----------------------------------------------------------
bool operator > (String & str1, String & str2)
{
if (strcmp(str1.p, str2.p) > 0) //字符串不能直接比较大小,必须用strcmp
{
return true; //输出为1,代表是正确的
}
else
{
return false;
}
}
//------------------------重载==---------------------------------------------------------
bool operator == (String & str1, String & str2)
{
if (strcmp(str1.p, str2.p) == 0) //字符串不能直接比较大小,必须用strcmp
{
return true; //输出为1,代表是正确的
}
else
{
return false;
}
}
//---------------------------------综合直观函数--------------------------------
void compare(String &str1,String &str2)
{
if ( operator<(str1,str2)==1)
{
str1.display();
cout << "<";
str2.display();
}
else if (operator>(str1, str2) == 1)
{
str1.display();
cout << ">";
str2.display();
}
else
{
str1.display();
cout << "=";
str2.display();
}
}
int main()
{
String str1("hello"), str2("book");
str1.display();
cout << endl;
str2.display();
cout << endl;
compare(str1, str2);
system("pause");
return 0;
}
运行结果:
注意:operator<(str1,str2):
是重载运算符的本质,本质是这个运算符是个函数。这种写法就是规范的。就是因为有operator这个关键字存在,所以 可以简化成平时看到的那种写法。
在这之前是3.27写的,因为后面去做相册了,今天继续写。