# 成员函数和友元函数 完成二元和一元运算符重载（进阶1）

#include <iostream>
using namespace std;

class Complex{//复数类
private:
int a;
int b;
friend Complex operator + (Complex &, Complex &);//注意声明友元函数
public:
Complex(int a = 0, int b = 0){
this->a = a;
this->b = b;
}
void print(){
cout << "a: " << a  << " " << "b: " << b << endl;
}
};

Complex operator + (Complex &a1, Complex &a2){
Complex tmp(a1.a + a2.a, a1.b + a2.b);
return tmp;
}

int main()
{
Complex c1(1, 2), c2(3, 4), c3;
c3 = c1 + c2;
c3.print();
return 0;
}

#include <iostream>
using namespace std;

class Complex{//复数类
private:
int a;
int b;
public:
Complex(int a = 0, int b = 0){
this->a = a;
this->b = b;
}
void print(){
cout << "a: " << a  << " " << "b: " << b << endl;
}
Complex operator - (Complex &a2){
Complex tmp(this->a - a2.a, this->b - a2.b);
return tmp;
}
};

int main()
{
Complex c1(1, 2), c2(3, 4), c3;
c3 = c1 - c2;
c3.print();
c3 = c2 - c1;
c3.print();
return 0;
}


#include <iostream>
using namespace std;

class Complex{//复数类
private:
int a;
int b;
friend Complex operator ++ (Complex &);
friend Complex operator ++ (Complex &, int);
public:
Complex(int a = 0, int b = 0){
this->a = a;
this->b = b;
}
void print(){
cout << "a: " << a  << " " << "b: " << b << endl;
}
Complex operator -- (){ //前置--操作符，成员函数方法实现
this->a --;
this->b --;
return (*this);
}
Complex operator --(int){ //后置--操作符，成员函数方法实现
Complex tmp = (*this);
this->a --;
this->b --;
return tmp;
}
};

Complex operator ++ (Complex &A){ //前置++操作符，用全局函数实现
A.a ++;
A.b ++;
return A;
}

Complex operator ++ (Complex &A, int){//后置++操作符，全局函数实现     加一个占位符跟前置加以区分
Complex tmp = A;
A.a ++;
A.b ++;
return tmp;
}

int main()
{
Complex c1(1, 2);

//前置++操作符，用全局函数实现
++c1;          //Complex c = operator ++ (c1);
c1.print();

//前置--操作符，成员函数方法实现
--c1;          //Complex c = c1.operator -- (&c1)
c1.print();

//后置++操作符，全局函数实现
c1++;          //Complex c = operator ++ (c1, 0);
c1.print();

//后置--操作符，成员函数方法实现
c1--;          //Complex c = c1.operator -- (0);
c1.print();

return 0;
}


• 本文已收录于以下专栏：

## 【C++ primer在练习中体悟】 C++中二元运算符重载需要使用friend的原因

• amagamag
• 2016年11月28日 20:58
• 542

## 成员函数重载运算符和友元函数重载运算符的比较

1.对双目运算符而言，成员函数重载运算符的函数参数表中只有一个参数，而用友元函数重载运算符函数参数表中含有两个参数。   对单木运算符来说，成员函数重载运算符的函数参数表中没有参数，而用友元函数重载运...
• u011450537
• 2014年11月13日 10:26
• 2843

## 解决：操作符重载， 二元运算符的参数之一必须是包含类型

• xxj_jing
• 2011年12月08日 19:50
• 3185

## 成员函数和友元函数 完成二元和一元运算符重载（进阶1）

• x_y_q_
• 2016年08月13日 23:02
• 538

## 运算符重载函数作为类成员函数与友元函数的区别

• Sharp_Zjf
• 2016年03月16日 10:49
• 1966

## 使用成员函数、友元函数和一般函数的区别

#include using namespace std; class Time { public: Time(int h,int m,int s):hour(h),minute(m),se...
• ListeningForever
• 2016年05月25日 16:43
• 1749

## 运算符重载常见问题：C#二元运算符的参数之一必须是包含类型

• wljhk2006
• 2015年01月29日 15:20
• 1369

## C++系列（运算符重载）

• yuanchunsi
• 2018年02月08日 11:05
• 30

## 成员函数和友元函数完成一元运算符重载

• qq_18973645
• 2017年01月09日 09:36
• 79

## C++运算符重载（友元函数方式）

• GarfieldEr007
• 2015年07月10日 11:27
• 1689

举报原因： 您举报文章：成员函数和友元函数 完成二元和一元运算符重载（进阶1） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)