光拷贝 A的数组元素 A的数组元素 A 占用的内存 A 占用的内存 alist alist sIze sIze template <class t> Array<T>:: Array( B a const Array<t>& X) i size=Xsize alist= Xalist void main( void) 拷贝前 Aray<int>A(10);拷贝后 Array<int> B(A) 休息
前一页 休息 11 浅拷贝 alist size A A的数组元素 占用的内存 拷贝前 alist size A A的数组元素 占用的内存 拷贝后 alist size B void main(void) { Array<int> A(10); ...... Array<int> B(A); ...... } template <class T> Array<T>::Array( const Array<T>& X) { size = X.size; alist= X.alist; }
深拷贝 A的数组元素 占用的内存 alist A的数组元素 A 占用的内存 alist size B alist B的数组元素 占用的内存 大斗 拷贝前 拷贝后
前一页 休息 12 深拷贝 alist size A A的数组元素 占用的内存 拷贝前 alist size A A的数组元素 占用的内存 拷贝后 alist size B B的数组元素 占用的内存
重〓运算符 template <class T> Array<T>& Array<T>: operator(const Array <T>& rhs) i int n= rhs size; if (size n) delete囗alit; alist new T[n] if (alist == NULL) Error(memory Allocation Error) size = n T destptr alist; T* srcptr= rhs alist while(n-) destptr++=*srcptr++ return *this. 了一页休息
前一页 休息 13 重载"="运算符 template <class T> Array<T>& Array<T>::operator= (const Array<T>& rhs) { int n = rhs.size; if (size != n) { delete [] alist; alist = new T[n]; if (alist == NULL) Error(memoryAllocationError); size = n; } T* destptr = alist; T* srcptr = rhs.alist; while (n--) *destptr++ = *srcptr++; return *this; }
重下标操作 template <class T> T& arrays:: operatori(int n) ∥检查下标是否越界 if (n <0 n> size-1) Error(indeXOutofRange, n) ∥返回下标为n的数组元素 return alist[nl; 了一页休息
前一页 休息 14 重载下标操作符 template <class T> T& Array<T>::operator[] (int n) { // 检查下标是否越界 if (n < 0 || n > size-1) Error(indexOutOfRange,n); // 返回下标为n的数组元素 return alist[n]; }
为什么有的函数返回引用 如果一个函数的返回值是一个对象的 值,它就被认为是一个常量,不能成 为左值。 ●如果返回值为引用。由于引用的实质 就是对象的地址,所以通过引用当然 可以改变对象的值。 休息
前一页 休息 15 为什么有的函数返回引用 ⚫ 如果一个函数的返回值是一个对象的 值,它就被认为是一个常量,不能成 为左值。 ⚫ 如果返回值为引用。由于引用的实质 就是对象的地址,所以通过引用当然 可以改变对象的值