数组类模板
2016-06-08 20:31
148 查看
// // main.cpp // project // // Created by 徐伟 on 6/8/16. // Copyright © 2016 fizz_i. All rights reserved. // #include <iostream> using namespace std; template <class T> class Array { private: T*list; int size; public: Array(int size=50); Array(const Array<T> &a); ~Array(); Array<T> &operator =(const Array<T> &rhs); T &operator [](int i); operator T*(); }; template<class T> Array<T>::Array(int sz) { size=sz; list=new T[size]; } template<class T> Array<T>::Array(const Array<T> &a) { size=a.size; list=new T[size]; } template<class T> Array<T>::~Array() { delete []list; } template<class T> Array<T> &Array<T>::operator =(const Array<T> &rhs) { if (&rhs != this) { //如果本对象中数组大小与rhs不同,则删除数组原有内存,然后重新分配 if (size != rhs.size) { delete [] list; //删除数组原有内存 size = rhs.size; //设置本对象的数组大小 list = new T[size]; //重新分配n个元素的内存 } //从对象X复制数组元素到本对象 for (int i = 0; i < size; i++) list[i] = rhs.list[i]; } return *this; //返回当前对象的引用 } template<class T> T &Array<T>::operator[](int i) { return *(list+i); } template<class T> Array<T>::operator T*() { return list; } int main() { Array<int> a(10); Array<int> b(a); Array<int> c; for (int i=0; i<10; ++i) { cin>>a[i]; } b=a; c=b; for (int i=0; i<10; ++i) { cout<<c[i]; } return 0; }
转换操作符(conversion operator)是一种特殊的类成员函数。它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字operator之后跟着转换的目标类型:
class SmallInt
{
public:
SmallInt(int i=0); val(i)
{
if(i < 0 || i > 255)
{
throw std::out_of_range("Bad SmallInt intializer");
}
}
operator int() const
{
return val;
}
private:
std::size_t val;
};
转换函数采用如下通用形式:
operator type();
这里,type表示内置类型名、类类型名或有类型别名所定义的名字。对任何可作为函数的返回类型(除了void之外)。一般而言,不允许转换为数组或函数类型,转换为指针类型(数据和函数指针)以及引用类型是可以的。
注解: 转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空。
下述所有的声明都是错误的:
operator int(Small Int& ); // error:nonmember
class SmallInt
{
public:
int operator int(); // error: return list
operator int(int = 0); // error:parameter list
// ...
};
虽然转换函数不能指定返回类型,但是每个转换函数必须显示返回一个指定的值。例如,operator int返回一个int值;如果定义operator Sales_item,它将返回一个Sales_item对象,诸如此类。
相关文章推荐
- VS2012 属性窗口中DOCUMENT中的"PageLayout属性"哪里去了
- EasyTalking微博系统
- Android AIDL理解
- okhttp的使用
- 第九周项目三人数不定的工资类
- 使用Fresco加载图片
- maven assembly plugin(打包插件)
- 若干数据结构 && 算法面试题【三】
- #pragma mark
- uva1442 cave
- 痛点无法解决 早餐始终上不了互联网台面
- web复习(三):js实现公告栏效果,间歇性滚动展示
- IOS 公共类-数字处理
- Example 3 : motion blur And Shade(Shadow)
- 机器学习中的过拟合问题以及解决方案
- 深复制1
- 学习进度14
- 在数组类的基础上,将之改造为类模板,以使数组中可以存储各种类型的数据
- 数组类
- JavaScript-Arguments 对象讲解