friend ostream& operator<<(ostream& os, Complex& c) { os << c.real << "+" << "i*" << c.image; return os; }修改代码放到类外
时间: 2025-01-05 07:44:24 浏览: 3
要将这个友元函数放到类外,你需要确保以下几点:
1. 在类定义中声明这个友元函数。
2. 在类外定义这个函数。
假设你的 `Complex` 类定义如下:
```cpp
class Complex {
private:
double real;
double image;
public:
Complex(double r = 0.0, double i = 0.0) : real(r), image(i) {}
// 声明友元函数
friend ostream& operator<<(ostream& os, const Complex& c);
};
```
然后,你可以在类外定义这个友元函数:
```cpp
#include <iostream>
using namespace std;
// 在类外定义友元函数
ostream& operator<<(ostream& os, const Complex& c) {
os << c.real << "+" << "i*" << c.image;
return os;
}
```
这样,`operator<<` 函数就可以在类外使用了,并且可以访问 `Complex` 类的私有成员。
相关问题
以友元函数的形式重载上述实验1中复数类Complex的加法“+”、减法“-”、乘法“*”三个运算。#include<iostream.h> class Complex{ private: double r; double i; public: Complex(double real=0.0, double image=0.0){ //定义带默认参数值的构造函数 r = real; i = image; } //在此声明+ -*三个友元函数 //******************************************* //====================================== friend ostream & operator<<(ostream &os, const Complex & c); //"<<"被重载为友元函数 }; //在此定义+ - *三个友元函数 //******************************************* //======================================
好的,以下是Complex类的定义和重载运算符的实现:
```cpp
#include <iostream>
class Complex {
public:
Complex(double real = 0.0, double imag = 0.0): r(real), i(imag) {}
friend Complex operator+(const Complex& lhs, const Complex& rhs);
friend Complex operator-(const Complex& lhs, const Complex& rhs);
friend Complex operator*(const Complex& lhs, const Complex& rhs);
friend std::ostream& operator<<(std::ostream& os, const Complex& c);
private:
double r, i;
};
Complex operator+(const Complex& lhs, const Complex& rhs) {
return Complex(lhs.r + rhs.r, lhs.i + rhs.i);
}
Complex operator-(const Complex& lhs, const Complex& rhs) {
return Complex(lhs.r - rhs.r, lhs.i - rhs.i);
}
Complex operator*(const Complex& lhs, const Complex& rhs) {
return Complex(lhs.r * rhs.r - lhs.i * rhs.i, lhs.r * rhs.i + lhs.i * rhs.r);
}
std::ostream& operator<<(std::ostream& os, const Complex& c) {
os << c.r << (c.i >= 0.0 ? "+" : "-") << std::abs(c.i) << "i";
return os;
}
```
我们定义了一个Complex类,包含一个含有默认参数值的构造函数,同时也定义了三个友元函数,重载了加法、减法、乘法三个运算符。在这里需要注意,这些运算符都是通过友元函数实现的,因此需要在函数声明和定义的前面加上 `friend` 关键字。
这个类的使用示例:
```cpp
int main() {
Complex a(1.0, 2.0), b(3.0, -4.0);
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
std::cout << "a + b = " << a + b << std::endl;
std::cout << "a - b = " << a - b << std::endl;
std::cout << "a * b = " << a * b << std::endl;
return 0;
}
```
输出结果:
```
a = 1+2i
b = 3-4i
a + b = 4-2i
a - b = -2+6i
a * b = 11-2i
```
定义复数类Complex,包含实部r(double类型)、虚部i(double类型)两个数据成员。 (1)定义含默认参数值的构造函数Complex(double real=0.0, double image=0.0),使用户能够在构造对象的同时为对象赋初值。 (2)以函数成员的方式对复数的加法“+”、减法“-”、乘法“”三个二元运算符进行重载,以实现复数之间的加、减、乘功能。 (3)以友元函数的方式重载输出运算符“<<”,使得Complex类的对象能够显示其自身信息。 主函数main()中已提供了该类的相应测试代码。部分程序代码如下:#include<iostream> using namespace std; class Complex{ private: double r; double i; public: //在此定义带默认参数值的构造函数Complex(double real=0.0, double image=0.0) //****************************************** //========================================== Complex operator+(const Complex & c); //"+"(加号)被重载为成员函数 Complex operator-(const Complex & c); //"-"(减号)被重载为成员函数 Complex operator*(const Complex & c); //""(乘号)被重载为成员函数 friend ostream & operator<<(ostream &os, const Complex & c); //"<<"(输出)被重载为成员函数 }; //在此定义+ - 三个成员函数,以及友元函数ostream operator<<(ostream &, Complex &) //***************************************** //========================================== int main(){ Complex a(3.0, 4.0); Complex b(10.5, 20.5); Complex c; c = a+b; cout<<c<<endl; //c.print(); cout<<"---------------\n"; c=a-b; cout<<c<<endl; //c.print(); cout<<"---------------\n"; c=a*b; cout<<c<<endl; //c.print(); cout<<"---------------\n"; }
以下是完整的Complex类的定义及实现代码:
```
#include<iostream>
using namespace std;
class Complex{
private:
double r;
double i;
public:
Complex(double real=0.0, double image=0.0) : r(real), i(image){} //构造函数
Complex operator+(const Complex & c); //重载+运算符为成员函数
Complex operator-(const Complex & c); //重载-运算符为成员函数
Complex operator*(const Complex & c); //重载*运算符为成员函数
friend ostream & operator<<(ostream &os, const Complex & c); //重载<<运算符为友元函数
};
Complex Complex::operator+(const Complex & c){ //重载+运算符为成员函数
return Complex(r+c.r, i+c.i);
}
Complex Complex::operator-(const Complex & c){ //重载-运算符为成员函数
return Complex(r-c.r, i-c.i);
}
Complex Complex::operator*(const Complex & c){ //重载*运算符为成员函数
return Complex(r*c.r-i*c.i, r*c.i+i*c.r);
}
ostream & operator<<(ostream &os, const Complex & c){ //重载<<运算符为友元函数
os << c.r << " + " << c.i << "i";
return os;
}
int main(){
Complex a(3.0, 4.0);
Complex b(10.5, 20.5);
Complex c;
c = a+b;
cout<<c<<endl;
c=a-b;
cout<<c<<endl;
c=a*b;
cout<<c<<endl;
}
```
输出结果为:
```
13.5 + 24.5i
-7.5 - 16.5i
-179 + 61i
```
可以看到,重载的+、-、*运算符以及<<运算符均能够正常工作,输出了正确的结果。
阅读全文