定义与说明
运算符重载是一种特殊的函数重载,即把运算符当做函数名进行重载
运算符重载是对已有的运算符使用范围进行扩展,使运算符在保持原功能的情况下,可以对更多的数据类型操作起作用
例如:一个Date类,声明a,b两个对象,执行 a - b 会报错,但是重载 “-”后就能实现对象的相减
为什么要对运算符重载
C++预定义中的运算符的作用对象只局限于那些基本数据类型,如int + int ,int + float 等等
语法
返回值类型 operator运算符名称(形参列表)
{
函数体
}
规定
- 不允许用户自己定义新的运算符
- 运算符重载不应该改变运算符被公认的功能。如把 “+”重载成减法功能
- 重载不能改变运算符操作数的个数。双目运算符需要两个参数,重载后仍需要两个参数
- 重载不能改变运算符的优先级。只能通过"()"强制改变
- 重载不能改变结合性。如*,/都是左结合性,不能重载成右结合性
- 运算符重载函数一般声明为类的成员函数,也可以声明为全局函数,若为全局函数,要访问类的private成员,则要声明为类的友元
- 运算符重载函数的参数要至少有一个是类的对象或类的引用。如:类名 operator+(类名 引用对象)
举例 重载“+”
重载 “+” 实现对象的相加
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
class Complex {
private:
double m_real;
double m_image;
public:
Complex():m_image(0.0),m_real(0.0) { //重载之前要对成员变量赋初值
}
Complex(double real,double image) {
m_real = real;
m_image = image;
}
Complex operator+(Complex &A) { //重载
Complex B;
B.m_image = this -> m_image + A.m_image; //1
B.m_real = this -> m_real + A.m_real; //2
return B;
}
//还可以写成更简单的形式(去掉 1 , 2):
//return Complex(this -> m_image + A.m_image,this -> m_real + A.m_real);
void Disp() const {
cout<<m_real<<"i+"<<m_image;
}
};
main() {
Complex c1(2.0,2.0);
Complex c2(1.0,2.0);
Complex c3;
c3 = c1 + c2; //还能写成 c3 = c1.operator+c2;
c3.Disp();
}
过程:执行时,编译器检测到 “+”号(+ 具有左结合性)左边是一个Complex对象,就会调用成员函数operator+(),也就是c1+c2,实质上是 “c1.operator+(c2);” 这是标准的函数调用形式。 (c1是要调用的函数的对象,c2是函数的实参,operator+ 是函数名)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
class Complex {
private:
double m_real;
double m_image;
public:
Complex():m_image(0.0),m_real(0.0) {
}
Complex(double real,double image) {
m_real = real;
m_image = image;
}
friend Complex operator+(Complex &A , Complex &B) { //重载
return Complex(A.m_image + B.m_image,A.m_real + B.m_real);
}
void Disp() const {
cout<<m_real<<"i+"<<m_image;
}
};
main() {
Complex c1(2.0,2.0);
Complex c2(1.0,2.0);
Complex c3;
c3=operator+(c1,c2);
//c3 = c1 + c2;
c3.Disp();
}
可以重载的运算符
双目算术运算符 | +,-,*,/,% |
---|---|
关系运算符 | ==,!=,<,>,<=,>= |
逻辑运算符 | !,||,&& |
单目运算符 | +,-,*(指针),& |
自增自减运算符 | ++,– |
位运算符 | |,&,~,^,<<,>> |
赋值运算符 | =,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>= |
空间申请与释放 | new, delete ,new[] ,delete[] |
其他运算符 | ()(函数调用),->(成员访问),->*(成员指针访问),,(逗号),[](下标) |
不可重载的运算符
成员访问运算符 | . |
---|---|
成员指针访问运算符 | * |
域运算符 | :: |
长度运算符 | sizeof |
条件运算符 | ?: |