运算符重载的意义: 因为c++是面向对象的编程语言,当两个对象需要进行一系列的运算符操作时就不能像普通的数据类型一样进行简单的运算符操作,这时候就需要将运算符进行重载,让对象的成员变量按照意愿进行运算,这样才能使运算正确进行。
全局函数、类成员函数方法实现运算符重载步骤:
1)要承认操作符重载是一个函数,写出函数名称 operator操作符
2)根据操作数,写出函数参数 operator操作符(参数1,参数2…)
3)根据业务,完善函数返回值(看函数是返回引用、指针、元素),及实现函数业务
注意:全局函数进行操作符重载时,因为有时候需要调用私有变量,所以全局函数需要声明成友元函数
二元运算符重载:就像a=b+c一样的运算,有两个或两个以上的变量进行运算时,重载函数称为二元运算符重载
一元运算符重载:就像a++一样的运算,只有一个变量进行运算时,重载函数称为一元运算符重载
二元运算符重载
#include "iostream"
using namespace std;
class test
{
public:
friend test operator+(test &t1, test &t2);//因为要调用私有变量,所以全局函数需要声明成友元函数
public:
test(int _a, int _b)
{
a = _a;
b = _b;
}
//2 成员函数的操作符重载
test operator+(test &t2)
{
test t3(a + t2.a, b + t2.b);
cout << t3.a << " + " << t3.b << "i" << endl;
return t3;
}
private:
int a; int b;
};
//1 定义了全局函数
test operator+(test &t1, test &t2)
{
test t3(t1.a + t2.a, t1.b + t2.b);
cout << t3.a << " + " << t3.b << "i" << endl;
return t3;
}
void main()
{
test t1(1, 2), t2(3, 4);
//test t3 = t1 + t2;//全局函数对操作符重载
test t4 = t1.operator+(t2);//成员函数对操作符重载
}
一元运算符重载
#include <iostream>
using namespace std;
class Complex
{
private:
int a;
int b;
//重载 前置++
friend Complex& operator++(Complex &c1);
//重载 后置++
friend Complex operator++(Complex &c1, int);//使用占位符,与前置++的友元函数避开函数错误重载
public:
Complex(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
void printCom()
{
cout << a << " + " << b << "i" << endl;
}
public:
//成员函数法 前置--
Complex& operator--()//返回值需要做左值或者右值时,需要返回元素本身(引用)---》参考(返回是引用)
//int a2 = function2();//将引用的值赋给变量(得到a的值)
//int& a3 = function2();//将引用的值赋给引用(得到a的地址)
{
this->a--;
this->b--;
return *this;
}
//后置--
Complex operator--(int)//使用占位符
{
Complex tmp = *this;
this->a--;
this->b--;
return tmp;
}
};
//前置++: 是先执行c1=c1+1;再把得到的新的c1返回去
Complex& operator++(Complex &c1)//返回一个引用
{
c1.a++;
c1.b++;
return c1;
}
//后置++: 是先把c1的值返回去再执行c1=c1+1;
Complex operator++(Complex &c1, int)//返回一个元素,为了不造成函数重载相同,使用一个int占位符
{
//先使用 再让c1加加
Complex tmp = c1;//后置++得到的是元素的本身,所以需要定义一个中间变量保存c1
//return c1;
c1.a++;
c1.b++;
return tmp;
}
void main()
{
Complex c1(1, 2);
//前置++操作符 用全局函数实现
++c1;
c1.printCom();
//前置--操作符 成员函数方法
--c1;
c1.printCom();
//后置++操作符 用全局函数实现
c1++;
c1.printCom();
//后置--操作符 用成员函数实现
c1--;
c1.printCom();
}