假设有向量X=(x1,x2,...,xn)和Y=(y1,y2,...,yn),他们之间的加、减、乘运算分别定义为:
X+Y=(x1+y1,x2+y2,...,xn+yn)
X-Y=(x1-y1,x2-y2,...,xn-yn)
X*Y=(x1*y1,x2*y2,...,xn*yn)
编写程序定义向量类Vector,重载运算符+,-,*和=,实现向量之间的加,减,乘和赋值运算;重载运算符>>、<<实现向量的输入输出功能。注意检测运算的合法性。
依题意得,Vector类应该用动态数组实现,所以首先写出构造函数对Vector类进行初始化;写出析构函数进行使用后空间释放
Vector(int);
Vector(double*,int);
~Vector();
{/*…*/}
Vector::Vector(int n)
{ v = new double[n];
len = n;
for (int i = 0; i < n; i++)
v[i] = 0; }
Vector::Vector(double* p, int n)
{
v = new double[n];
len = n;
for (int i = 0; i < n; i++)
v[i] = p[i];
}
Vector::~Vector { delete v; v = NULL; len = 0; }
之后便是老生常谈的运算符重载了,还是要注意拷贝构造函数和赋值运算符重载的配合使用
Vector& Vector::operator=(Vector a)
{
for (int i = 0; i < len; i++)
v[i] = a[i];
return *this;
}
Vector::Vector(const Vector& a)
{
v = new double [a.len];
for (int i = 0; i < 3; i++)
v[i] = a.v[3];
}
结合上一篇博客,可以对比一下拷贝构造函数和赋值运算符重载在不同情况下的使用
提一嘴[]运算符的重载。[]的重载目的在于可以直接 对象[整形] 的方式来访问对象中的成员,而无需使用 对象.成员[] 的格式。[]运算符的重载只能使用成员函数进行重载,参考代码:
double& operator[](int i)const { return this->v[i]; }
剩下的运算符重载与之前的无太大差别,这边不再赘述,直接给出完整代码:
#include <iostream>
using namespace std;
class Vector
{
private: double* v; int len;
public:
Vector(int);
Vector(double*,int);
Vector(const Vector& a);
~Vector() { delete v; v = NULL; len = 0; }
friend ostream& operator<<(ostream&, Vector&);
friend istream& operator>>(istream&, Vector&);
double& operator[](int i)const { return this->v[i]; }
Vector& operator=(Vector);
friend Vector operator+(Vector&, Vector&);
friend Vector operator-(Vector&, Vector&);
friend Vector operator*(Vector&, Vector&);
};
Vector::Vector(int n) { v = new double[n]; len = n; for (int i = 0; i < n; i++)v[i] = 0; }
Vector::Vector(double* p, int n)
{
v = new double[n];
len = n;
for (int i = 0; i < n; i++)
v[i] = p[i];
}
Vector::Vector(const Vector& a)
{
v = new double [a.len];
for (int i = 0; i < 3; i++)
v[i] = a.v[3];
}
ostream& operator<<(ostream& out, Vector& a)
{
out << '(';
for (int i = 0; i < a.len-1; i++)
out << a[i]<<',';
out << a[a.len - 1] << ')';
return out;
}
istream& operator>>(istream& in, Vector& a)
{
for (int i = 0; i < a.len; i++)
in >> a[i] ;
return in;
}
Vector& Vector::operator=(Vector a)
{
for (int i = 0; i < len; i++)
v[i] = a[i];
return *this;
}
Vector operator+(Vector& a, Vector& b)
{
int size;
size = a.len;
double*p= new double[a.len];
for (int i = 0; i < a.len; i++)
p[i] = a[i] + b[i];
return Vector(p,size);
}
Vector operator*(Vector& a, Vector& b)
{
int size;
size = a.len;
double* p = new double[a.len];
for (int i = 0; i < a.len; i++)
p[i] = a[i] * b[i];
return Vector(p, size);
}
Vector operator-(Vector& a, Vector& b)
{
int size;
size = a.len;
double* p = new double[a.len];
for (int i = 0; i < a.len; i++)
p[i] = a[i] - b[i];
return Vector(p, size);
}
int main()
{
int size1, size2;
cout << "请输入两个向量的元素个数:\n";
IN:cin >> size1 >> size2;
if (size1 != size2)
{
cout << "向量维度不同,无法进行计算,请重新输入!\n";
goto IN;
}Vector a(size1), b(size2);
cout << "请输入第一个向量a:";
cin >> a;
cout << "请输入第二个向量b:";
cin >> b;
Vector c(size1);
cout << "a=" << a;
cout << "\nb=" << b;
c = a+b;
cout << "\na+b="<<c;
c = a - b;
cout << "\na-b=" << c;
c = a * b;
cout << "\na*b=" << c;
}