运算符重载+ -两种方法以及前后置++/--实现

#include
using namespace std;
/*
全局函数 类成员函数方法实现运算符重载步骤
1)要承认操作运算符是一个函数,写出函数名称
2)根据操作数,写出函数参数
3)根据业务,完善函数返回值(看函数但是返回引用 还是指针 元素),以及实现函数业务
*/
class Complex
{
public:
friend Complex operator+(Complex &c1, Complex &c2);//利用友元函数访问私有成员变量
//重载前置++
friend Complex& operator++(Complex &c1);
//重载后置++
friend Complex operator++(Complex &c1, int);
Complex(int a, int b)
{
this->a = a;
this->b = b;
}


void printCom()
{
cout << a << "+" << b << "i" << endl;
}
//通过类成员函数完成-操作符重载 
Complex operator-(Complex &c2)
{
Complex tmp = Complex(this->a-c2.a,this->b-c2.b);
return tmp;
}
//通过成员函数完成前置--
Complex& operator--()//Complex& operator--(Complex &c1)这么写报错:后缀“operator--”的额外参数必须是“int”类型 为什么
{
this->a--;
this->b--;
return *this;
}
//通过成员函数法, 完成后置--  先使用,后减减
Complex operator--(int)
{
Complex tmp = *this;
this->a--;
this->b--;
return tmp;
}
private:
int a;
int b;


};
//通过全局函数方法完成+操作符重载 
Complex operator+(Complex &c1, Complex &c2)
{
Complex tmp = Complex(c1.a + c2.a,c1.b+c2.b);
return tmp;
}


//前置++ 全局函数法
Complex& operator++(Complex &c1)//前置++,是先加加,在使用
{
c1.a++;
c1.b++;
return c1;
}
//重载后置++ 全局函数法
Complex operator++(Complex &c1,int)//函数的返回型不同,不能区别函数重载,c++大牛采用了函数占位参数和前置++ 相区别
{
//先使用,后加加
//要把c1临时值先返回出去,在加加
Complex tmp = c1;//这里把c1的临时值拷贝给tmp
c1.a++;
c1.b++;
return tmp;
}


int main()
{
Complex c1(1, 3), c2(4, 6);
Complex c3 = c1 + c2;
//通过全局函数方法完成+操作符重载 
//函数声明 Complex operator+(Complex &c1, Complex &c2) 
//函数调用分析 
c3.printCom();
cout << "=================我是分隔符=======================" << endl;


//通过类成员函数完成-操作符重载 
//函数声明 Complex operator-(Complex &c2) 
//函数调用分析 
//用类成员函数实现-运算符重载
Complex c4 = c1 - c2;
c4.printCom();
cout << "=================我是分隔符=======================" << endl;


//前置++操作符 用全局函数实现  因为这里他是返回c1本身,所以用引用比较合适
//Complex& operator++(Complex &c1)
++c1;
c1.printCom();
cout << "=================我是分隔符=======================" << endl;


//前置-- 用成员函数实现  这里同时也是成员函数与全局函数的区别  
//把成员函数 转成 全局函数 多了一个参数
//void prinT(A *pT)
//全局函数 转成 成员函数  少了一个参数 
//Complex& operator--();
--c1;
c1.printCom();
//c1.operator--();//说明这里隐藏了this指针
cout << "=================我是分隔符=======================" << endl;


//后置++ 用全局函数实现
//这里返回是元素,不是上面一样 引用????为什么不一样,没有解释到位

//注意点:
// 1、前置返回的是引用,后置返回的是临时对象。因为后置的时候原来的对象已经被++改变了。前置用引用则是为了不产生临时变量,减少内存的消耗而已。


// 2、注意后置的函数声明,参数列表中比前置多了一个int,这里似乎是不符合运算符重载的定义的,++是属于一元运算符,理应后置时没有右边的数作为参数进行传入。所以说,这里的int其实是作为区分前后置的标志而已,在函数体里面并没有直接地用到。作为一个规则把它记住就好。


// 3、类似的, - -号也应该是这样进行重载。


//Complex operator++(Complex &c1,int);
c1++;
c1.printCom();
cout << "=================我是分隔符=======================" << endl;


//后置-- 用成员函数实现
//Complex operator--(int);
c1--;
c1.printCom();
//c1.operator--(int);


cout << "hello..." << endl;
system("pause");
return 0;
}

你可能感兴趣的:(C/C++)