#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++ 中运算符重载和友元函数的用法。
- 理解这些特性有助于编写更简洁、易读的代码,尤其是在处理自定义数据类型时。
