#include <iostream>
using namespace std;class Complex {
public:Complex(int = 0, int = 0); // 构造函数,默认参数为 0friend ostream & operator <<(ostream &, const Complex &); // 输出运算符重载friend Complex operator +(const Complex &, const Complex &); // 加法运算符重载
private:int real, img; // 复数的实部和虚部
};// 构造函数实现
Complex::Complex(int a, int b) {real = a;img = b;
}// 输出运算符重载实现
ostream & operator <<(ostream &tt, const Complex &rr) {tt << rr.real << "+" << rr.img << "i"; // 格式化为 a+bireturn tt;
}// 加法运算符重载实现
Complex operator +(const Complex &tt, const Complex &rr) {int r = tt.real + rr.real; // 实部相加int i = tt.img + rr.img; // 虚部相加return Complex(r, i); // 返回新的复数对象
}int main() {Complex a(1, 2), b(3, 4), c; // 创建复数对象 a, b, cc = a + b; // 计算 a + bcout << c << " hello"; // 输出 c 和字符串return 0;
}
代码解析
类 Complex
定义
-
成员变量:
int real
:复数的实部。int img
:复数的虚部。
-
构造函数:
Complex(int a = 0, int b = 0) { real = a; img = b; }
- 默认参数为
0
,用于初始化复数的实部和虚部。
- 默认参数为
-
友元函数:
- 输出运算符重载:
friend ostream & operator <<(ostream &, const Complex &);
- 用于将复数对象输出到流中。
- 加法运算符重载:
friend Complex operator +(const Complex &, const Complex &);
- 用于实现两个复数对象的加法运算。
- 输出运算符重载:
函数实现
-
构造函数实现:
Complex::Complex(int a, int b) { real = a; img = b; }
-
输出运算符重载实现:
ostream & operator <<(ostream &tt, const Complex &rr) {tt << rr.real << "+" << rr.img << "i";return tt; }
- 将复数对象格式化为
a+bi
的形式输出到流中。
- 将复数对象格式化为
-
加法运算符重载实现:
Complex operator +(const Complex &tt, const Complex &rr) {int r = tt.real + rr.real;int i = tt.img + rr.img;return Complex(r, i); }
- 将两个复数的实部和虚部分别相加,返回一个新的复数对象。
main
函数
int main() {Complex a(1, 2), b(3, 4), c; // 创建复数对象 a, b, cc = a + b; // 调用加法运算符重载,计算 a + bcout << c << " hello"; // 调用输出运算符重载,输出 c 和字符串return 0;
}
运行结果分析
-
创建对象:
Complex a(1, 2)
:a
的实部为1
,虚部为2
。Complex b(3, 4)
:b
的实部为3
,虚部为4
。Complex c
:c
的实部和虚部默认初始化为0
。
-
加法运算:
c = a + b
:- 实部:
1 + 3 = 4
- 虚部:
2 + 4 = 6
c
的值为4+6i
。
- 实部:
-
输出结果:
cout << c << " hello"
:- 输出
c
的值4+6i
,后跟字符串" hello"
。
- 输出
完整输出
4+6i hello
关键点总结
-
运算符重载:
- 通过友元函数重载
<<
和+
运算符,使得复数对象可以直接使用<<
输出和+
相加。
- 通过友元函数重载
-
友元函数:
- 友元函数可以访问类的私有成员,适用于需要外部函数操作类内部数据的场景。
-
默认参数:
- 构造函数的默认参数
0
使得对象可以默认初始化。
- 构造函数的默认参数
-
链式调用:
- 输出运算符重载返回
ostream&
,支持链式调用,如cout << c << "hello"
。
- 输出运算符重载返回
总结
- 代码通过运算符重载实现了复数对象的加法和输出功能,展示了 C++ 中运算符重载和友元函数的用法。
- 理解这些特性有助于编写更简洁、易读的代码,尤其是在处理自定义数据类型时。