运算符重载
C++预定义了表示对数据的运算
+,-,*,/,^,&,~,!,|,=,<<,>>,!=,==
只能用于
基本的数据类型
整型,实型,字符型,逻辑型……
C++提供了数据抽象的手段:
用户自己定义数据类型 –类
·调用累的成员函数
à操作它的对象
类的成员函数
à操作对象时,很不方便
·在数学上两个复数可以直接进行+/-等运算
Vs. 在C++,直接将+,-用于复数是不行的。
于是我们需要使用运算符重载
目的:
对抽象数据类型也能够直接使用C++提供的
运算符
程序更简洁
代码更容易理解
例1:
complex_a和complex_b是两个复数对象,我们希望直接complex_a + complex_b.
运算符重载
·对已有的运算符赋予多重的含义
使同一运算符作用于不同类型的数据时
à不同类型的行为
目的:
扩展C++中提供的运算符的适用范围,以用于类所表示的抽象数据类型
运算符重载的实质是函数重载
返回值类型 operator 运算符(形参表)
{
……
}
在程序编译的时候:
把含 运算符的表达式
à对
运算符函数的调用
把运算符的操作数
à运算符函数的
参数
运算符被多次重载是,根据
实参的类型决定调用哪个运算符函数,个数呢? 个数不用考虑,因为个数都一样。
运算符可以被重载成
普通函数
也可以被重载成
类的成员函数
1)运算符可以被重载成
普通函数
class Complex {
public:
Complex(double r= 0.0, double i = 0.0){
real = r;
imaginary = i;
}
double real;
double imaginary;
};
Complex operator+(const Complex &a,const Complex &b){
return Complex(a.real+b.real,a.imaginary+b.imaginary);
}
Complex a(1,2),b(2,3),c;
c = a + b; //也可以写成 c = operator+(a,b);
重载为普通函数时,参数个数为运算符目数。
2)运算符重载为
成员函数
此时a+b其实是a.operator+(b);所以重载为成员函数时,参数个数为运算符目数减一
#include
<iostream>
using
namespace
std;
class
Complex
{
public
:
Complex(
double
r
= 0.0,
double
m
= 0.0) :real(
r
), imaginary(
m
) { }
//constructor
Complex
operator+
(
const
Complex
&);
Complex
operator-
(
const
Complex
&);
public
:
double
real;
double
imaginary;
};
Complex
Complex
::
operator+
(
const
Complex
&
operand2
) {
return
Complex
(real +
operand2
.real, imaginary +
operand2
.imaginary);
}
Complex
Complex
::
operator-
(
const
Complex
&
operand2
) {
return
Complex
(real -
operand2
.real, imaginary -
operand2
.imaginary);
}
int
main() {
Complex
x, y(4.3, 8.2), z(3.3, 1.1);
x
=
y
+
z; //x = y.operator+(z);
cout
<<
x.real
<<
endl;
x
=
y
-
z; //x= y.operator-(z);
cout
<<
x.real
<<
endl;
system(
"pause"
);
return
0;
}