MyVector案例

xiaoxiao2021-02-28  167

http://blog.csdn.net/sun19910114/article/details/39890045

http://blog.csdn.net/caroline_wendy/article/details/23941807

如果想更好的理解默认复制构造函数内容,可以仔细阅读上面两篇文章。

MyVector类的功能:

表示一组相关的数据;

比如:数学中的向量、物理中的矢量、数组、数据库理论中的元组等

数据上的操作:

数乘:每个数组都乘以一个数

笛卡尔积:设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成有序对,所有这样的有序对组成的集合叫做A与B的笛卡尔积,记作AxB。

假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

标准模板库中的Vector模板类:

MyVector类 的设计:这是一个向量类

重载输入输出向量加减

int operator[](int i) 下标运算符,将向量看成类似数组的数据,用下标的方式取出向量中的某一个分量

private:

int* Array;//向量中的一组数据是如何存储的,用这个指针指向一片连续的空间

int num;//向量中包含多少个元素

MyVector::MyVector(int m)

{

num=m;//代表这个向量对象中有m个元素

Array=new int[num];//开辟了一段连续的空间

for(int i=0;i<num;i++)//深复制

{

Array[i]=0;

}

}

MyVector(const MyVector& v)//这是一个复制构造函数

{

num=v.num;

if(Array!=NULL)delete[]Array;//预防Array之前已经指向某些地方了,而这些地方需要释放掉之后才能使用Array,否则的话如果这些地方不被释放,而Array又被使用指向了其他的地方,那么原来那些地方就永远不能释放了,内存泄漏

Array=new int[num];//必须用深复制

for(int i=0;i<num;i++)

{

Array[i]=v.Array[i];

}

}

将MyVector对象当做函数参数来使用,或者说作为函数的返回值,如果一个函数的参数是一个类的对象,当实参向形参传递参数的时候,会自动执行复制构造函数。因此为了更完整,经常需要定义复制构造函数。

MyVector::~MyVector()

{ delete[] Array;

}

int MyVector operator[](int i)

{ return Array[i];//没有实施越界保护

}

上面的重载运算可以通过

对象名[int i]来引用,比如:

d[12]也就是说,经过重载之后,可以通过数组元素的访问方式来访问MyVector类对象中的元素。

转载请注明原文地址: https://www.6miu.com/read-40220.html

最新回复(0)