第四章——运算符重载运算课后练习题

练习题1

解题思路:题目中描述是非成员,非友元的普通函数,又要实现复数的运算。第一感觉应该把real和imag设置成public,但是这样就破坏了C++的封装性,所以,我设置了一个getReal()和getImag()的函数,获取real和imag数据

//类声明文件
#include<iostream>
using namespace std;
class Complex
{
public:
	//构造函数
	Complex();                                                   
	//构造构造函数
	Complex(int ,int );
	int getReal();
	int getImag();
	void display();
private:
	int real;
	int imag;
};

//类实现文件
#include<iostream>
#include "complex.h"
using namespace std;
Complex::Complex():real(0),imag(0){}
Complex::Complex(int r,int i):real(r),imag(i){}
int Complex::getReal()
{
	return this->real;
}
int Complex::getImag()
{
	return this->imag;
}
void Complex::display()
{
	cout<<this->real<<" + "<<this->imag<<"i"<<endl;
}

//主函数文件
#include<iostream>
#include "complex.h"
using namespace std;
Complex operator +( Complex &complex1, Complex &complex2)
{
	return (Complex(complex1.getReal()+complex2.getReal(),complex1.getImag()+complex2.getImag()));

}
int main()
{
	class Complex complex1(3,30),complex2(5,20);
	Complex complex3 = complex1 + complex2;
	complex3.display();

	system("pause");
	return 0;
}

练习题2

//类声明文件
#include<iostream>
using namespace std;
class Complex
{
public:
	//构造函数
	Complex();                                                   
	//构造构造函数
	Complex(int ,int );
	Complex operator +( Complex &complex);
	Complex operator -( Complex &complex);
	Complex operator *( Complex &complex);
	Complex operator /( Complex &complex);
	int getReal();
	int getImag();
	void display();
private:
	int real;
	int imag;
};

//类实现文件
#include<iostream>
#include "complex.h"
using namespace std;
Complex::Complex():real(0),imag(0){}
Complex::Complex(int r,int i):real(r),imag(i){}
Complex Complex::operator +( Complex &complex)
{
	return (Complex(this->real + complex.real,this->imag + complex.imag));

}
Complex Complex::operator -( Complex &complex)
{
	return (Complex(this->real - complex.real,this->imag - complex.imag));

}
Complex Complex::operator *( Complex &complex)
{
	return (Complex(this->real * complex.real - this->imag * complex.imag,this->real * complex.imag + this->imag * complex.real));

}
Complex Complex::operator /( Complex &complex)
{
	int Denominator = complex.real * complex.real + complex.imag * complex.imag;
	if(Denominator != 0)
	{
	
		return (Complex((this->real * complex.real + this->imag * complex.imag)/Denominator,(this->imag * complex.real - this->real * complex.imag)/Denominator));

	}
	
}

int Complex::getReal()
{
	return this->real;
}
int Complex::getImag()
{
	return this->imag;
}
void Complex::display()
{
	cout<<this->real<<" + "<<this->imag<<"i"<<endl;
}

//主函数文件
#include<iostream>
#include "complex.h"
using namespace std;

int main()
{
	class Complex complex1(3,30),complex2(5,20);
	Complex complex3 = complex1 + complex2;

	complex3.display();
	Complex complex4 = complex1 - complex2;
	complex4.display();

	Complex complex5 = complex1 * complex2;
	complex5.display();

	Complex complex6 = complex1 / complex2;
	complex6.display();


	system("pause");
	return 0;
}

练习题3

解题思路:根据题目描述,可以决定采用友元函数+转换构造函数可以实现加法交换律

//类声明文件
#include<iostream>
using namespace std;
class Complex
{
public:
	//构造函数
	Complex();                                                   
	//构造构造函数
	Complex(int ,int );
	//转换构造函数
	Complex(int );
	friend Complex operator +( const Complex &,const Complex &);
	int getReal();
	int getImag();
	void display();
private:
	int real;
	int imag;
};

//类实现文件
#include<iostream>
#include "complex.h"
using namespace std;
Complex::Complex():real(0),imag(0){}
Complex::Complex(int r):real(r),imag(0){}// 转换构造函数
Complex::Complex(int r,int i):real(r),imag(i){}
Complex operator +( const Complex &complex1,const Complex &complex2)
{
	return (Complex(complex1.real + complex2.real,complex1.imag + complex2.imag));

}
int Complex::getReal()
{
	return this->real;
}
int Complex::getImag()
{
	return this->imag;
}
void Complex::display()
{
	cout<<this->real<<" + "<<this->imag<<"i"<<endl;
}

//主函数文件
#include<iostream>
#include "complex.h"
using namespace std;

int main()
{
	class Complex complex1(3,30),complex2(5,20);
	Complex complex3 = complex1 + complex2;
	complex3.display();
	complex3 = 2 + complex2;
	complex3.display();
	complex3 = complex2 + 2;
	complex3.display();
	system("pause");
	return 0;
}

练习题4+5

解题思路:在矩阵中我用了二维数组指针,同时还用了指针的指针。在析构函数中释放指针的指针,在浅拷贝中容易造成野指针,所以我使用了复制构造函数,解决上述问题。

指针的指针接收指针数组的过程,参考博客:https://blog.csdn.net/ChaoFeiLi/article/details/103674308

//类声明文件
#include<iostream>
using namespace std;
class Matrix
{
public:
	Matrix(int = 1,int = 1);
	Matrix(const Matrix&);
	friend Matrix operator +(const Matrix&,const Matrix&);
	friend ostream& operator <<(ostream&,const Matrix&);
	friend istream& operator >>(istream&,const Matrix&);
	void set();
	void set(double **,int,int);
	void display();
	~Matrix(){
		delete []ptr;
	}
protected:
	float **ptr;
private:
	
	int row;
	int column;
};

//类实现文件
#include<iostream>
#include "matrix.h"
using namespace std;
Matrix::Matrix(int r ,int c)
{
	if(r ==0 || c == 0)
	{
		return;
	}
	row = r;
	column = c;
	ptr = new float* [row];
	for(int i = 0; i < row; i++)
	{
		   ptr[i] = new float [column];
	}
}
Matrix::Matrix(const Matrix&matrix)
{
	this->row = matrix.row;
	this->column = matrix.column;
	this->ptr = new float*[row];
	for(int i = 0;i<row;i++)
	{
		ptr[i] = new float[column];
		for(int j = 0;j<column;j++)
		{
			this->ptr[i][j] = matrix.ptr[i][j];
		}
	}
}
Matrix operator +(const Matrix &matrix1,const Matrix &matrix2)
{
	int row = matrix1.row;
	int column = matrix1.column;
	Matrix matrix(row,column);

	for(int i = 0;i < row;i++)
	{
		for(int j = 0;j < column;j++)
		{
			matrix.ptr[i][j] = matrix1.ptr[i][j] + matrix2.ptr[i][j];
		}
	}
	return matrix;
}


ostream& operator <<(ostream &output,const Matrix &matrix)
{
	int row = matrix.row;
	int column = matrix.column;
	for(int i = 0;i < row;i++)
	{
		for(int j = 0;j < column;j++)
		{
			output<<matrix.ptr[i][j]<<"  ";
		
		}
		output<<endl;
	
	}
	

	return output;

}
istream& operator >>(istream& input,const Matrix&matrix)
{
	int row = matrix.row;
	int column = matrix.column;
	for(int i = 0;i < row;i++)
	{
		for(int j = 0;j < column;j++)
		{
			input>>matrix.ptr[i][j];
		
		}
	
	}
	return input;

}
void Matrix::set()
{
	for(int i = 0;i < row;i++)
	{
		for(int j = 0;j < column;j++)
		{
			cin>>ptr[i][j];
		
		}
	
	}

}
void Matrix::set(double **p,int r,int c)
{
	ptr = new float *[row];
	for (int i = 0;i < row;i++)
	{
		ptr[i] = new float[column];
		for (int j = 0;i<column;j++)
		{
				ptr[i][j] = p[i][j];
		}
	}


}
void Matrix::display()
{
	for(int i = 0;i < row;i++)
	{
		for(int j = 0;j < column;j++)
		{
			cout<<ptr[i][j]<<"  ";
		
		}
		cout<<endl;
	
	}
}

//主函数文件
#include<iostream>
#include "matrix.h"
using namespace std;
int main()
{


	Matrix matrix1(2,3);
	cin>>matrix1;
	cout<<endl;
	Matrix matrix2(2,3);
	cin>>matrix2;
	Matrix matrix = matrix1 + matrix2;
	cout<<matrix;

	system("pause");
	return 0;
}

练习题6

//类声明文件
#include<iostream>
using namespace std;
class Complex
{
public:
	//构造函数
	Complex();                                                   
	//构造构造函数
	Complex(double,double);
	//转换构造函数
	Complex(double);
	//类型转换函数
	operator double() const;
	void display();
private:
	double real;
	double imag;
};
//类实现文件
#include<iostream>
#include "complex.h"
using namespace std;
Complex::Complex():real(0),imag(0){}
Complex::Complex(double r):real(r),imag(0){}
Complex::Complex(double r,double i):real(r),imag(i){}

void Complex::display()
{
	cout<<this->real<<" + "<<this->imag<<"i"<<endl;
}
Complex::operator double() const
{
	return this->real;
}

//主函数文件
#include<iostream>
#include "complex.h"
using namespace std;
int main()
{
	class Complex complex1(3,30);
	double d1 = 2.5;
	d1 = d1 + complex1;
	cout<<d1<<endl;
	Complex(d1).display();
	system("pause");
	return 0;
}

练习题7

必须把class Student中的成员变量设置为public的,或者通过get函数获取;在转换构造函数中无法使用

//类声明文件
#include <iostream>
class Student
{
public:
	Student(int,char [],char);
	void display();
	int num;
	char name[50];
	char sex;

};
class Teacher
{
public:
	Teacher(int,char [],char);
	//转换构造函数
	Teacher(const Student&);
	void display();
private:
	int num;
	char name[50];
	char sex;

};
//类实现文件
#include <iostream>
#include "worker.h"
using namespace std;
Student::Student(int n,char na[],char s)
{
	this->num = n;
	strcpy(this->name, na);
	this->sex = s;
}
void Student::display()
{
	cout <<name<<endl;
}
Teacher::Teacher(int n,char na[],char s)
{
	this->num = n;
	strcpy(this->name, na);
	this->sex = s;
}
Teacher::Teacher(const Student &student)
{
	this->num = student.num;
	strcpy(this->name, student.name);
	this->sex = student.sex;
}
void Teacher::display()
{
	cout<<this->name<<"   "<<this->num<<"   "<<this->sex<<endl;
}
//主函数文件
#include<iostream>
#include "worker.h"
using namespace std;
int main()
{
	class Student student1(2017,"andrew",'m');
	student1.display();
	class Teacher teacher1(student1);
	teacher1.display();
	system("pause");
	return 0;
}
发布了114 篇原创文章 · 获赞 28 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ChaoFeiLi/article/details/103671312