C++ 数组类模板

news/2024/7/4 0:47:04 标签: c++, class, null, allocation, delete, c
cle class="tags" href="/tags/CLASS.html" title=class>class="baidu_pl">
cle_content" class="tags" href="/tags/CLASS.html" title=class>class="article_content clearfix">
content_views" class="tags" href="/tags/CLASS.html" title=class>class="htmledit_views">
class="tags" href="/tags/CLASS.html" title=class>class="articalTitle">
class="tags" href="/tags/CLASS.html" title=class>class="articalContent " id="sina_keyword_ad_area2">

对于学习C++类模板来说࿰c;这个例子是个很值得研究的代码࿰c;包含了很多信息。所谓类模板࿰c;本人粗浅的理解就是当你的类中含有通用的数据类型时候࿰c;就可以用类模板࿰c;比如说࿰c;你开发一个类࿰c;他包含的数据可能是整数型࿰c;也可能是字符型࿰c;也可能是双精度型࿰c;当我要写一个都能处理这些不同类型数据的东西的时候࿰c;就可以考虑运用类模板去写。

 

以下是教科书上关于数组类模板的代码࿰c;很经典࿰c;值得细细思考其中的深刻的思想。

 

#ifndef ARRAY_CLASS
#define ARRAR_CLASS

#include<iostream>

#include<cstdlib>

using namespace std;

#ifndef NULL
const int NULL=0;
#endif  //定义NULL=0

//错误类型集合

enum ErrorType
{
 invalidArraySize,memoryAllocationError,indexOutOfRange
  
};
//错误信息

char *errorMsg[]=
{
  "invalidArraySize",
  "Memory class="tags" href="/tags/ALLOCATION.html" title=allocation>allocation error",
  "Invalid index:"

};


//数组类模板声明

template <class="tags" href="/tags/CLASS.html" title=class>class T>

class="tags" href="/tags/CLASS.html" title=class>class Array
{
 private:
  T* alist ; //T指针类型࿰c;用于存放动态分配的数组内存首地址
  int size;//数组大小
  void Error(ErrorType error,int badIndex=0) const;//错误处理函数
 public:
  Array(int sz=50);
  Array(const Array<T>& A);//拷贝构造函数
  ~Array(void);//析构函数
  Array<T>&operator =(const Array<T> &rhs);//重载“=”使得数组对象可以整体赋值
  T& operator[](int i);//重载[]࿰c;使得Array 对象可以起到C++普通数组的作用
  operator T*(void)const;//重载T*,使得Array对象可以起到C++普通数组的作用
  int ListSize(void)const;//取数组大小;
  void Resize(int sz);//修改数组的大小


};

//以下为类成员函数的定义

//模板函数Error实现输出错误信息的功能

template<class="tags" href="/tags/CLASS.html" title=class>class T>
void Array<T>::Error(ErrorType error,int badIndex)const
{
 cout<<errorMsg[error];
 if(error==indexOutOfRange)
  cout<<badIndex;
 cout<<endl;
 exit(1);

}


//构造函数

template <class="tags" href="/tags/CLASS.html" title=class>class T>
Array<T>::Array(int sz)
{
 if(sz<=0)
  Error(invalidArraySize);
 size=sz;//将元素个数赋值给变量size
 alist=new T[size];//动态分配内存࿰c;将size个T类型的元素空间分配出来
 if(alist==NULL)
  Error(memoryAllocationError);


}

//析构函数
template<class="tags" href="/tags/CLASS.html" title=class>class T>
Array<T>::~Array(void)
{
 class="tags" href="/tags/DELETE.html" title=delete>delete []alist;
}


//拷贝构造函数

template <class="tags" href="/tags/CLASS.html" title=class>class T>
Array<T>::Array(const Array<T>& X)
{
 //从对象X取得数组大小࿰c;并赋给当前对象成员
 int n=X.size;
 size=n;
 //为对象申请内存并进行出错检测
 alist=new T[n];
 if(alist==NULL)
  Error(memoryAllocationError);
 //从对象X复制数组元素到本对象
 T* srcptr=X.alist;//X.alist是对象X的数组首地址
 T* destptr=alist;//alist是本对象中的数组首地址
 while(n--)
  *destptr++=*srcptr++;

}


//重载'='
template<class="tags" href="/tags/CLASS.html" title=class>class T>
Array<T>& Array<T>::operator =(const Array<T> &rhs)
{
 int n=rhs.size;//取rhs数组的大小
 //如果本对象中的数组大小和rhs不同࿰c;则删除数组原有的内存࿰c;然后重新分配
 if (size!=n)
 {
  class="tags" href="/tags/DELETE.html" title=delete>delete []alist;
  alist=new T[n];
  if(alist==NULL)
   Error(memoryAllocationError);
  size=n;

 }


 //从rhs向本对象复制元素
 T* destptr=alist;
 T* srcptr=rhs.alist;
 while(n--)
  *destptr++=*srcptr++;
 return *this;//返回当前对象的引用
}

 

//重载[]
template <class="tags" href="/tags/CLASS.html" title=class>class T>
T &Array<T>::operator[](int n)
{
 if(n<0||n>size-1)
  Error(indexOutOfRange,n);

 return alist[n];

}


//重载指针转换运算
template <class="tags" href="/tags/CLASS.html" title=class>class T>
Array<T>::operator T*(void)const
{
 return alist;

}

 

//取当前数组大小
template<class="tags" href="/tags/CLASS.html" title=class>class T>
int Array<T>::ListSize(void)const
{
 return size;

}


//将数组大小修改为sz
template <class="tags" href="/tags/CLASS.html" title=class>class T>
void Array<T>::Resize(int sz)
{
 if(sz<=0)
  Error(invalidArraySize);
 if(sz==size)
  return;
 T *newlist=new T[sz];
 if(newlist==NULL)
  Error(memoryAllocationError);
 int n=(sz<=size)?sz:size;
 T *srcptr=alist;
 T *destptr=newlist;
 while(n--)
  *destptr++=*srcptr++;
 class="tags" href="/tags/DELETE.html" title=delete>delete []alist;
 alist=newlist;
 size=sz;
}
#endif //ARRAY_CLASS

cle>

http://www.niftyadmin.cn/n/1285075.html

相关文章

经典面试题-什么是Spring框架?Spring框架有哪些主要模块?

官网框架 Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题&#xff0c;使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照设计模式精心打造&#xff0c;这使得我们可以在开发环境中安心…

FZU2285 迷宫问题 BFS求最短路-板子题

Problem Description 洪尼玛今天准备去寻宝&#xff0c;在一个n*n &#xff08;n行, n列&#xff09;的迷宫中&#xff0c;存在着一个入口、一些墙壁以及一个宝藏。由于迷宫是四连通的&#xff0c;即在迷宫中的一个位置&#xff0c;只能走到与它直接相邻的其他四个位置&#xf…

android中的强指针和弱指针

在Android的源代码中&#xff0c;经常会看到形如&#xff1a;sp<xxx>、wp<xxx>这样的类型定义&#xff0c;这其实是Android中的智能指针。智能指针是C中的一个概念&#xff0c;通过基于引用计数的方法&#xff0c;解决对象的自动释放的问题。在C编程中&#xff0c;…

经典面试题-使用Spring框架能带来哪些好处?

下面列举了一些使用Spring框架带来的主要好处&#xff1a; Dependency Injection(DI) 方法使得构造器和JavaBean properties文件中的依赖关系一目了然。与EJB容器相比较&#xff0c;IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下进行应用程序的开发…

AtCoder Beginner Contest 154

A.题意&#xff1a;看输入输出即可 red blue 3 4 red2 4思路&#xff1a;这个题不是很难&#xff0c;但是我一上去就想要用map,然后就很悲催&#xff0c;map里面人家按照键值给你排序&#xff0c;所以输出的时候会有错&#xff01; #include<bits/stdc.h> #define pair…

经典面试题-什么是控制反转(IOC)?什么是依赖注入(DI)?

控制反转(IOC) 控制反转是应用于软件工程领域中的&#xff0c;在运行时被装配器对象来绑定耦合对象的一种编程技巧&#xff0c;对象之间耦合关系在编译时通常是未知的。在传统的编程方式中&#xff0c;业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使…

利用反转函数确定回文串

题意&#xff1a;给出一个字符串&#xff0c;然后让你判断是否为回文串&#xff0c;是得话输出YES&#xff0c;否则输出NO 思路&#xff1a;我们可以直接利用string 跟 reverse&#xff08;&#xff09;函数解决这个问题 #include<bits/stdc.h>using namespace std;int…

android中的binder通信机制

Binder机制是android中实现的进程间通信的架构&#xff0c;它采用的是c/s架构&#xff0c;client通过代理完成对server的调用。ServiceManager既然这里提到了server&#xff0c;那么我们有必要先了解下在android中是怎么来管理server的。先来看一个重要的Native进 程&#xff1…