最近学校C++学到了类,要求自己实现一个向量类,做了一部分典型的重载运算符,以作笔记。
本类Vector对应的是一个向量,通过一个长度为n的数组(为了简化而取int)对应n维向量。
class Vector{//首先是类申明,用的构造函数是默认构造函数,实在是懒得写了
public:
void Input(int *A,int n1); //输入部分,要求输入目标向量的数组名和实际需要的长度
~Vector();//析构函数
void Vecnew(int nk); //申请动态数组
void Print();//输出函数
void operator=(const Vector &v);//重载等号
void Vector::operator+=(int j)const;//重载+=
friend Vector Vector::operator+(Vector &v,Vector &u);//重载w=v+u类型,w,v,u向量类
private:
int *k; //数组指针
int n; //长度、维数
};
- 准备工作:
void Vector::Input(int *A,int n1){
n=n1;
Vecnew(n1);//申请动态数组
int i;
for(i=0;i<n1;i++){
k[i]=A[i];
}
}//录入完毕
void Vector::Vecnew(int nk){
k=new int[nk];//根据输入的长度申请动态空间
k[nk]='\0';//防止溢出
}
- 只做了三种重载,分别是:
1.=,其他重载的基础
2.+=,仅需要对一个常数进行支持,和++这类单目运算符类似
3.w=v+u,需要对另两个类进行支持,需要用到友元函数
其他的运算符无非也就止于这三类,不急于一次性完成所有的重载
第一类:=
void Vector::operator=(const Vector &v){ //申明重载,右侧类记作v,左侧为w
n=v.n;//类w的初始化
Vecnew(n);//同上
int i;
for(i=0;i<n;i++){
k[i]=v.k[i];
}//复制完毕
}
第二类:+=
void Vector::operator+=(int j)const{ //参照第一类
int i;
for(i=0;i<n;i++){
k[i]+=j;
}
}
第三类:w=v+u
friend Vector:: Vector operator+(Vector &v,Vector &u){//申明重载并使用友元函数
Vector w;//临时存放的目标类
w.n=v.n;
w.Vecnew(w.n);
int i;
for(i=0;i<w.n;i++){
w.k[i]=v.k[i]+u.k[i];
}
return w;//返回类到等号右侧
}
- 析构函数
~Vector(){
k[0]='\0';//防止溢出
delete k;//删除动态空间
}