以下程序已在VC6.0测试通过:
#ifndef _ARRAY1D
#define _ARRAY1D
#include<iostream.h>
template<class T>
class CArray1D
{
public:
CArray1D(int size = 0);
CArray1D(const CArray1D<T>& v); // 复制构造函数
~CArray1D() {delete [] element;}
T& operator[](int i) const;
int Size() {return size;}
CArray1D<T>& operator=(const CArray1D<T>& v);
CArray1D<T> operator+() const; // 一元加法操作符
CArray1D<T> operator+(const CArray1D<T>& v) const;
CArray1D<T> operator-() const; // 一元减法操作符
CArray1D<T> operator-(const CArray1D<T>& v) const;
CArray1D<T> operator*(const CArray1D<T>& v) const;
CArray1D<T>& operator+=(const T& x);
void Output(ostream& out) const;
private :
int size;
T *element; //一维数组
};
template<class T>
CArray1D<T>::CArray1D(int sz)
{// 一维数组的构造函数
if (sz >= 0)
{
size = sz;
element = new T[sz];
}
}
template<class T>
CArray1D<T>::CArray1D(const CArray1D<T>& v)
{// 一维数组的复制构造函数
size = v.size ;
element = new T[size]; // 申请空间
for (int i = 0; i < size; i++) // 复制元素
element[i] = v.element[i];
}
template<class T>
T& CArray1D<T>::operator[](int i) const
{// 返回指向第i个元素的引用
if (i >= 0 &&i < size)
return element[i];
}
template<class T>
CArray1D<T>& CArray1D<T>::operator=(const CArray1D<T>& v)
{// 重载赋值操作符=
if (this != &v) {// 不是自我赋值
size =v.size;
delete [] element; // 释放原空间
element = new T[size]; // 申请空间
for (int i = 0; i < size; i++) //复制元素
element[i] = v.element[i];
}
return *this;
}
template<class T>
CArray1D<T> CArray1D<T>:: operator-(const CArray1D<T>& v) const
{// 返回w = (*this) - v
if (size == v.size)
{
// 创建结果数组w
CArray1D<T> w(size);
for (int i = 0; i < size; i++)
w.element[i] =element[i] -v.element[i];
return w;
}
}
template<class T>
CArray1D<T> CArray1D<T>::operator-() const
{// 返回w = -(*this)
// 创建结果数组w
CArray1D<T> w(size);
for (int i = 0; i < size; i++)
w.element[i] = -element[i];
return w;
}
template<class T>
CArray1D<T>& CArray1D<T>::operator+=(const T& x)
{ //把x 加到( *this)的每个元素上
for (int i = 0; i<size; i++)
element[i] += x;
return *this;
}
template<class T>
void CArray1D<T>::Output(ostream& out) const
{
for (int i = 0; i<size; i++)
out<<element[i] << " ";
}
// 重载<<
template <class T>
ostream& operator<<(ostream& out, const CArray1D<T>& x)
{
x.Output(out);
return out;
}
#endif
在主函数的调用如下:
#include "Array1D.h"
void main()
{
#include "Array1D.h"
void main()
{
CArray1D<int> w(5);
w[0]=1;
w[1]=22;
w[2]=10;
w[3]=32;
w[4]=98;
cout<<w<<endl;
w+=5;
cout<<w<<endl;
w=-w;
cout<<w<<endl;
}
}