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类对象中的元素。
