目录
一、什么是运算符重载
1.定义
2.实质
3.【例4.1】通过成员函数实现复数的加法
二、运算符重载的方法
1.格式
2.规则和限制
(1)规则和限制
(2)两种形式
(3)运算符函数
3.【例4.2】重载运算符,用于两个复数相加
(1)分析
(2)代码&结果
(3)说明
三、重载运算符的规则
四、运算符重载函数作为类成员函数与友元函数
1.【例4.3】将加法运算符重载为适用于复数加法,重载函数作为类的友元函数
编辑2.【注】
3.书上的错误
五、重载双目运算符
1.含义
2.【例4.4】定义一个字符串类String,用来处理不定长的字符串,重载相等、大于、小于关系运算符,用于两个字符串的等于、大于、小于的比较运算
(1)【分析】
(2)代码&结果
(3)说明
3.扩展到对三个运算符重载:在String类体中声明三个重载函数是友元函数,并编写相应的函数
六、重载单目运算符
1.含义
2.【例4.5】有一个Time类,数据成员有时、分、秒。要求模拟秒表,每次走一秒,满60秒进位,秒又从零开始计数。满60分进位,分又从零开始计数。输出时、分、秒的值
3.【例4.6】在【例4.5】的基础上增加后++运算符重载函数
七、重载流插入运算符和流提取运算符
1.含义
2.重载流插入运算符“<<”
(1)【例4-7】在【例4-2】的基础上用<<重载函数输出复数
(2)说明
3.重载流提取运算符“>>”
(1)【例4.8】在【例4.7】的基础上增加流提取运算符>>重载函数,用cin>>输入复数,用cout输出复数
(2)说明
C++为程序员提供了灵活的手段,让程序员自己定义类,自己设计相应的运算符(必须在已有的运算符基础上设计),使之应用于自己定义的类。与函数重载相似,对已有的运算符赋予新的含义,用一个运算符表示不同功能的运算,这就是运算符重载。
实际上,我们在此之前已经使用了运算符重载。如<<是C++的移位运算符,它又与流对象cout配合作为流插入运算符,这是C++对<<进行了重载处理。
运算符重载是对已有的运算符赋予多重含义。
#include
using namespace std;
class Complex
{
private:
double real;
double imag;
public:
Complex()
{
real = 0;
imag = 0;
}
Complex(double r, double i)
{
real = r;
imag = i;
}
Complex complex_add(Complex &c2);
void display();
};
Complex Complex::complex_add(Complex &c2)
{
Complex c;
c.real = real + c2.real;
c.imag = imag + c2.imag;
return c;
}
void Complex::display()
{
cout << "(" << real << "," << imag << "i)" << endl;
}
int main()
{
Complex c1(3, 4), c2(5, -10), c3;
c3 = c1.complex_add(c2);
cout << "c1=";
c1.display();
cout << "c2=";
c2.display();
cout << "c1+c2";
c3.display();
return 0;
}
运算符重载的方法是定义一个重载运算符函数,在需要时系统自动调用该函数,完成相应的运算。运算符重载实质上是函数的重载。运算符重载函数的格式是:
数据类型 operator 运算符(形参表)
{重载处理}
数据类型:是重载函数值的数据类型
operator是保留字
函数类型 operator 运算符(形参)
{
...
}
Complex operator+(Complex &c2);
定义一个复数类,用成员函数实现加号的重载函数。两个复数相加结果仍是复数,所以函数的返回值的类型也是复数。用成员函数实现运算符重载函数时,掉用格式是“对象名.成员名”,此时对象就是一个参与运算的操作数,假发还需要另一个操作数,这个操作数用函数的参数传递,参数的类型就是复数类,而运算结果用函数值返回。
#include
using namespace std;
class Complex
{
public:
Complex()
{
real = 0;
imag = 0;
}
Complex(double r, double i)
{
real = r;
imag = i;
}
Complex operator +(Complex &c2);
void display();
private:
double real;
double imag;
};
Complex Complex::operator +(Complex &c2)
{
Complex c;
c.real = real + c2.real;
c.imag = imag + c2.imag;
return c;
}
void Complex::display()
{
cout << "(" << real << "," << imag << "i)" << endl;
}
int main()
{
Complex c1(3, 4), c2(5, -10), c3;
c3 = c1 + c2; //直接用+即可
cout << "c1=";
c1.display();
cout << "c2=";
c2.display();
cout << "c1+c2=";
c3.display();
return 0;
}
在【例4.2】程序中对运算符+进行了重载,该例将运算符重载函数定义为复数类的成员函数。从该程序中看到运算符重载为成员函数时,带有一个类类型的形参,而另一个加数就是对象自己。
#include
using namespace std;
class complex
{
public:
complex()
{
real = 0;
imag = 0;
}
complex(double r)
{
real = r;
imag = 0;
}
complex(double r, double i)
{
real = r;
imag = i;
}
friend complex operator +(complex &c1, complex &c2);
void display();
private:
double real;
double imag;
};
complex operator +(complex &c1, complex &c2)
{
return complex(c1.real + c2.real, c1.imag + c2.imag); //显式调用构造函数
}
void complex::display()
{
cout << "(" << real << "," << imag << "i)" << endl;
}
int main()
{
complex c1(3, 4), c2(5, -10), c3;
c3 = c1 + c2;
cout << "c1=";
c1.display();
cout << "c2=";
c2.display();
cout << "c1+c2=";
c3.display();
return 0;
}
complex operator +(complex &c1,complex &c2)
{
return complex(c1.real+c2.real,c1.imag+c2.imag);
}
complex complex::operator +(int &i)
{
return complex(real+i,imag);
}
friend complex operator +(int &i,complex &c)
{
return complex(c.real+i,c.imag);
}
- 成员函数(左操作数是对象,右操作数是非对象)、 友元函数(左操作数是非对象,右操作数是对象)
- 友元函数(左操作数是对象,右操作数是非对象)、友元函数(左操作数是非对象,右操作数是对象)
#include
using namespace std;
#include
#include
#include
using namespace std;
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;
}
int main()
{
String string1("Hello"), string2("Book");
cout << (string1 > string2) << endl;
return 0;
}
#include
#include
using namespace std;
class String
{
public:
String()
{
p = NULL;
}
String(char *str);
friend bool operator > (String &string1, String &string2);
friend bool operator < (String &string1, String &string2);
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;
}
bool operator <(String &string1, String &string2)
{
if (strcmp(string1.p, string2.p) < 0)
return true;
else
return false;
}
bool operator ==(String &string1, String &string2)
{
if (strcmp(string1.p, string2.p) == 0)
return true;
else
return false;
}
int main()
{
String string1("Hello"), string2("Book");
cout << (string1 > string2) << endl;
cout << (string1 < string2) << endl;
cout << (string1 == string2) << endl;
return 0;
}
#include
using namespace std;
class Time
{
public:
Time()
{
hour = 0;
minute = 0;
sec = 0;
}
Time(int h, int m, int s): hour(h), minute(m), sec(s) {}
Time operator++();
void display()
{
cout << hour << ":" << minute << ":" << sec << endl;
}
private:
int hour;
int minute;
int sec;
};
Time Time::operator++()
{
sec++;
if (sec >= 60)
{
sec = sec - 60;
minute++;
if (minute >= 60)
{
minute = minute - 60;
hour++;
hour = hour % 24;
}
}
return *this;
}
int main()
{
Time time1(23, 59, 0);
for (int i = 0; i < 61; i++)
{
++time1;
}
time1.display();
return 0;
}
【注】C++除了有前++外,还有后++。同样的运算符由于操作数的位置不同,含义也不同。怎样区分前++和后++呢?C++给了一个方法,在自增或自减运算符重载函数中,增加一个int形参,程序员可以选择带int形参的函数做前++,也可以选择不带int形参的函数做前++
#include
using namespace std;
class Time
{
public:
Time()
{
hour = 0;
minute = 0;
sec = 0;
}
Time(int h, int m, int s): hour(h), minute(m), sec(s) {}
Time operator++(); //前++
Time operator++(int); //后++
void display()
{
cout << hour << ":" << minute << ":" << sec << endl;
}
private:
int hour;
int minute;
int sec;
};
Time Time::operator++()
{
sec++;
if (sec >= 60)
{
sec = sec - 60;
minute++;
if (minute >= 60)
{
minute = minute - 60;
hour++;
hour = hour % 24;
}
}
return *this;
}
Time Time::operator++(int)
{
Time temp(*this); //保存修改前的对象做返回值
++(*this);
return temp;
}
int main()
{
Time time1(21, 34, 59), time2;
cout << "time1:";
time1.display();
++time1;
cout << "++time1:";
time1.display();
time2 = time1++;
cout << "time1++:";
time1.display();
cout << "time2:";
time2.display();
return 0;
}
istream & operator >>(istream&,自定义类&);
ostream & operator <<(ostream&,自定义类&);
#include
using namespace std;
class Complex
{
public:
Complex()
{
real = 0;
imag = 0;
}
Complex(double r, double i)
{
real = r;
imag = i;
}
Complex operator +(Complex &c2);
friend ostream &operator <<(ostream &, Complex &);
void display();
private:
double real;
double imag;
};
Complex Complex::operator +(Complex &c2)
{
Complex c;
c.real = real + c2.real;
c.imag = imag + c2.imag;
return c;
}
ostream &operator <<(ostream &output, Complex &c)
{
output << "(" << c.real << "," << c.imag << "i)" << endl;
return output;
}
void Complex::display()
{
cout << "(" << real << "," << imag << "i)" << endl;
}
int main()
{
Complex c1(3, 4), c2(5, -10), c3;
c3 = c1 + c2;
cout << c3;
return 0;
}
分析C++怎样处理“cout< { cout<<"("< return cout; }
3.重载流提取运算符“>>”
(1)【例4.8】在【例4.7】的基础上增加流提取运算符>>重载函数,用cin>>输入复数,用cout输出复数
#include
(2)说明
ostream &operator <<(ostream &output, Complex &c)
{
ouput<<"("<