实现矩阵加法
使用运算符重载 定义矩阵加法和流输入、流输出算符。
#include <iostream>
using namespace std;
class M{ //定义矩阵类
public:
M();
friend M operator+(M &a,M &b); //重载运算符“+”
friend istream &operator>>(istream &in,M &c1);
friend ostream &operator<<(ostream &out,M &c1);
private:
int mat[2][3];
};
M::M() //定义构造函数
{for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
mat[i][j]=0;
}
M operator+(M &a,M &b) //定义重载运算符“+”函数
{M c;
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
{c.mat[i][j]=a.mat[i][j]+b.mat[i][j];}
return c;
}
istream & operator >>(istream &cin, M &c1){
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
cin>>c1.mat[i][j];
}
}
return cin;
}
ostream & operator <<(ostream &cout, M &c1){ for (int i=0;i<2;i++)
{for(int j=0;j<3;j++)
{cout<<c1.mat[i][j]<<" ";
}
cout<<endl;
}
return cout;
{
int main(){
M a, b, c;
cin >> a;
cin >> b;
c = a + b;
cout << c;
return 0;
}
实现复数运算
使用运算符重载 加减乘除和流输入、流输出,实现复数运算。
#include<iostream>
#include<string>
using namespace std;
class Complex{
public:
Complex() { real = 0; imag = 0; }
Complex(double r, double i) { real = r; imag = i; }
Complex operator + (Complex c2);
Complex operator - (Complex c2);
Complex operator * (Complex c2);
Complex operator / (Complex c2);
friend ostream& operator << (ostream&, Complex&);
friend istream& operator >> (istream&, Complex&);
Complex ( int r){ real = r; imag = 0; }
private:
double real;
double imag;
};
Complex Complex::operator + (Complex c2){
return Complex(real + c2.real, imag + c2.imag);
}
Complex Complex::operator - (Complex c2){
return Complex(real - c2.real, imag - c2.imag);
}
Complex Complex::operator * (const Complex c2) {
Complex tmp(real * c2.real - imag * c2.imag, real * c2.imag + imag * c2.real);
return tmp;
}
Complex Complex::operator / (const Complex c2){
Complex c3;
c3.real = (real * c2.real + imag * c2.imag) / (c2.real*c2.real + c2.imag * c2.imag);
c3.imag = (imag * c2.real - real * c2.imag) / (c2.real*c2.real + c2.imag * c2.imag);
return c3;
}
ostream& operator << (ostream& output,Complex& c){
if (c.real != 0){
if (c.imag > 0){
if (c.imag == 1) {
output << c.real << "+" << "i";
}
else{
output << c.real << "+" << c.imag << "i";
}
}
else if (c.imag < 0){
if (c.imag == -1){
output << c.real << "-" << "i";
}
else{
output << c.real << c.imag << "i";
}
}
else{
output << c.real;
}
}
else{
if (c.imag == 0){
output << 0;
}
else if (c.imag == 1){
output << "i";
}
else if (c.imag == -1){
output << "-i";
}
else{
output << c.imag << "i";
}
}
return output;
}
istream& operator >> (istream& input, Complex& c){
input >>c.real >>c.imag;
return input;
}
int main(){
Complex a, b, c;
cin >> a >> b;
c = a + b + 5;
cout << c << endl;
c = a - b - 5;
cout << c << endl;
c = a * b * 5;
cout << c << endl;
c = a / b / 5;
cout << c << endl;
return 0;
}
程序补充
一、重载“()”与构造
与前第三章的补充题二对比知道重载函数和引用函数的区别
#include <iostream>
using namespace std;
class A {
public:
int v;
// 你的代码添加在这里
A(){v=0;}//构造
int& operator()(){//重载()运算符 把v 的值进行返回
return v;
//return this->v;//或者使用this指到当前对象
}
};
int main(){
int n;
cin >> n;
A a;
cout << a.v << endl;
a() = n;//重载了()
cout << a.v << endl;
return 0;
}
二、重载“=”与构造
#include <iostream>
using namespace std;
class A{
public:
int value;
A(int n = 0){//带参构造
value = n;
}
// 你的代码添加在这里
A& operator=(const A& a){//重载等号,因为双目运算符需要确定主体为前者
value= 5*a.value;
}
};
int main(){
int x;
cin >> x;
A a(x);
A b;//默认构造
b = a;//观察知此处应该重载才能进行倍数运算
cout << b.value << endl;
return 0;
}
用类模板设计一个通用类数组模块
#include<iostream>
#include<string>
using namespace std;
template <typename T>//声明类
class Array{
public:
Array(int n){
xn=n;
cout<<"分配"<<n<<"个数组元素"<<endl;
}
T& operator[](int i){//重载运算符[],连接数组元素与数
return a[i];
}
~Array(){//析构函数
cout<<"释放数组"<<endl;
}
private:
int xn;
T a[100];
};
template<typename T>
void mysort(Array<T>&a,int n){//冒泡排序
int j=0,m=0;
for (j = 0; j < n; j++) {
for ( m = 0; m < n-1; m++) {
T temp;
if (a[m] > a[m+1]) {
temp = a[m];
a[m] = a[m + 1];
a[m + 1] = temp;
}
}
}
}
int main(){
int n;
cin >> n;
Array<int> a(n);//指明实际变量类型int ,说明需要使用类模板
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
mysort(a, n); // 排序
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
复制构造连接两个类
定义一个Teacher(教师)类和一个Student(学生)类,二者有共同的数据成员name(姓名)、age(年龄)、addr(地址),编写这两个类
#include <iostream>
# include <string>
using namespace std;
class Teacher; //声明老师类
class Student{
public:
int age;
string name;
string addr;
void get_value();
};
void Student::get_value(){
cin>>name;cin>>age;
cin>>addr;
}
class Teacher{
private:
int age;
string name;
string addr;
public:
Teacher (){};
void display();
Teacher(const Student & s);//复制构造函数
};
void Teacher::display(){
cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"addr:"<<addr<<endl;
}
Teacher ::Teacher(const Student & s){//复制构造函数把学生的对象复制到老师的对象
age=s.age;
name=s.name;
addr=s.addr;
}
int main(){
Teacher t;
Student s;
s.get_value();
t = s;
t.display();
return 0;
}
实现一个时间类
#include <iostream>
#include <iomanip>
using namespace std;
class Time{
public:
Time() { hour = 0; minute = 0; sec = 0; }
Time operator++();//重载前++
Time operator++(int);//重载后++
friend ostream& operator << (ostream&, Time&);
friend istream& operator >> (istream&, Time&);
private:
int hour;
int minute;
int sec;
};
Time Time::operator ++(){//前置单目运算符重载函数
sec++;
if (sec >= 60) {
sec = sec - 60; minute++;
if (minute >= 60) {
minute = minute - 60;
hour++; hour = hour % 24;
}
}
return *this;}
Time Time::operator++(int){
Time temp(*this);
// 保存修改前的对象做返回值
++(*this);
return temp;}
ostream& operator << (ostream& output,Time& T){
cout << setw(2) << setfill('0') <<T.hour << ":" << setw(2) << setfill('0') <<T.minute << ":" << setw(2) << setfill('0') <<T.sec;
return output;}
istream& operator >> (istream& input, Time& T){
input >>T.hour >>T.minute>>T.sec;
return input;}
int main(){
Time t, t1, t2;
cin >> t;
t1 = t++;
t2 = ++t;
cout << t << endl;
cout << t1 << endl;
cout << t2 << endl;
return 0;
}
重载实现分数运算 加减乘除
#include<iostream>
#include<cmath>
using namespace std;
class Fraction{
public:
Fraction(){}
Fraction(const int &a){
top=a;den=1;
}
friend ostream& operator << (ostream&, Fraction&);
friend istream& operator >> (istream&, Fraction &);
Fraction operator +(const int &i);
Fraction operator -(const int &i);
Fraction operator *(const int &i);
Fraction operator /(const int &i);
Fraction operator +(Fraction &p);
Fraction operator -(Fraction &p);
Fraction operator *(Fraction &p);
Fraction operator /(Fraction &p);
private:
int top;
int den;
};
void swap(int &x, int &y) {
int tem;
tem = x;
x = y;
y = tem;
}//交换
int calculator(int a, int b) {
int tem1 = abs(a), tem2 = abs(b);
while (tem1 != tem2) {
if (tem1 > tem2) {
tem1 = tem1 - tem2;
}
else {
swap(tem1, tem2);
}
}
return tem1;
}//求最大公因数
Fraction Fraction::operator +(const int &i){
Fraction temp,p(i);
if(p.den==den){
temp.top=top+p.top;
temp.den=den;
}//同分母
else{
temp.top=p.top*den+top*p.den;
temp.den=den*p.den;
}//通分
return temp;
}
Fraction Fraction::operator +(Fraction &p){
Fraction temp;
if(p.den==den){
temp.top=top+p.top;
temp.den=den;
}//同分母
else{
temp.top=p.top*den+top*p.den;
temp.den=den*p.den;
}//通分
return temp;
}
Fraction Fraction::operator -(const int &i){
Fraction temp,p(i);
if(p.den==den){
temp.top=top-p.top;
temp.den=den;
}//同分母
else{
temp.top=top*p.den-p.top*den;
temp.den=den*p.den;
}//通分
return temp;
}
Fraction Fraction:: operator -(Fraction &p){
Fraction temp;
if(p.den==den){
temp.top=top-p.top;
temp.den=den;
}//同分母
else{
temp.top=top*p.den-p.top*den;
temp.den=den*p.den;
}//通分
return temp;
}
Fraction Fraction ::operator *(const int &i){
Fraction temp,p(i);
temp.top=top*p.top;
temp.den=den*p.den;
return temp;
}
Fraction Fraction:: operator *(Fraction &p){
Fraction temp;
temp.top=top*p.top;
temp.den=den*p.den;
return temp;
}
Fraction Fraction::operator /(const int &i){
Fraction temp,p(i);
temp.top=top*p.den;
temp.den=den*p.top;
return temp;
}
Fraction Fraction::operator /(Fraction &p){
Fraction temp;
temp.top=top*p.den;
temp.den=den*p.top;
return temp;
}
ostream& operator << (ostream& cout,Fraction& F)
{int x=calculator(F.top,F.den);
F.top/=x;
F.den/=x;
if(F.den==1){
cout<<F.top<<endl;
}
else if(F.den==-1){
cout<<"-"<<F.top;
}
else if (F.top < 0 && F.den < 0) {
cout <<abs(F.top) <<"/"<<abs(F.den);
}
else if (F.top > 0 && F.den < 0){
cout <<"-"<<F.top <<"/"<<abs(F.den);
}
else if (F.top > 0 && F.den > 0){
cout <<F.top <<"/"<<F.den;
}
else if (F.top < 0 && F.den > 0){
cout <<"-"<<abs(F.top) <<"/"<<F.den;
}
return cout;}
istream& operator >> (istream& input, Fraction& F1)
{
input >>F1.top >>F1.den;
return input;}
int main()
{
Fraction a, b, c;
cin >> a >> b;
c = a + b + 1;
cout << c << endl;
c = a - b - 1;
cout << c << endl;
c = a * b * 1;
cout << c << endl;
c = a / b / 1;
cout << c << endl;
return 0;
}
对等号重载实现分数的化简
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class Fraction{
private:
int _s, _m;
public:
void Print() { cout << _s << "/" << _m << endl; }
// 在此处补充你的代码
Fraction operator=(const string & s){
int i;
int len=s.length();
char *p=new char[len+1];
for (i=0;i<len;i++){
p[i]=s[i];
}
p[i]='\0';
_s=atoi(p) ;
if(*(++p)>'9'||*(++p)<'0'){
p++;
};
_m=atoi(p);
int tem1 = abs(_s), tem2 = abs(_m),tem;
while (tem1 != tem2) {
if (tem1 > tem2) {
tem1 = tem1 - tem2;
}
else {
tem = tem1;
tem1 = tem2;
tem2 = tem;
}
}
if(_m<0){
_s=-_s;
_m=-_m;
}
_s/=tem1;
_m/=tem1;
return *this;
}
};
int main() {
Fraction a;
a = "3/5"; a.Print();
a = "48/-72"; a.Print();
return 0;
}