C++ 简单实现数组类泛型编程示例

简介: 原创: C++ 简单实现数组类泛型编程示例 1、使用模板来实现泛型编程 2、本数组应该能够存储各种基础类型,各种复杂的类类型 3、应该实现部分操作符重载 其实操作符重载满满的都是套路。
原创:
C++ 简单实现数组类泛型编程示例

1、使用模板来实现泛型编程
2、本数组应该能够存储各种基础类型,各种复杂的类类型
3、应该实现部分操作符重载


其实操作符重载满满的都是套路。


代码如下:

点击(此处)折叠或打开

  1. 模板类实现:
  2. /*************************************************************************
  3.     > File Name: arra.cpp
  4.     > Author: gaopeng QQ:22389860 all right reserved
  5.     > Mail: gaopp_200217@163.com
  6.     > Created Time: Mon 10 Apr 2017 08:28:01 AM CST
  7.  ************************************************************************/

  8. #include<iostream>
  9. #include <stdlib.h>
  10.  #include <string.h>
  11. using namespace std;


  12. template <typename T>
  13. class myarray
  14. {
  15.         private:
  16.                 T* array;
  17.                 unsigned int lenth;
  18.         public:
  19.                 myarray();
  20.                 myarray(unsigned int len);
  21.                 myarray(const myarray& a);
  22.                 myarray& operator=(const myarray& b);
  23.                 T& operator[](int ind);
  24.                 ~myarray();
  25. };




  26. template <typename T>
  27. myarray<T>::~myarray()
  28. {
  29.         if(this->array != NULL)
  30.         {
  31.                 delete [] this->array;
  32.                 this->array = NULL;
  33.         }

  34. }


  35. template <typename T>
  36. myarray<T>::myarray()
  37. {
  38.         this->array = NULL;
  39.         this->lenth = 0;
  40. }

  41. template <typename T>
  42. myarray<T>::myarray(unsigned int len)
  43. {
  44.         this->array = new T[len];
  45.         this->lenth = len;
  46.         memset(this->array,0,sizeof(T)*len);
  47. }
  48. template <typename T>
  49. myarray<T>::myarray(const myarray<T>& a)
  50. {
  51.         int i;
  52.         this->lenth = a.lenth;
  53.         this->array = new T[a.lenth];
  54.         memset(this->array,0,sizeof(T)*a.lenth);
  55.         for(i=0;i<a.lenth;i++)
  56.         {
  57.                 *(this->array+i) = *(a.array+i);
  58.         }
  59. }

  60. template <typename T>
  61. myarray<T>& myarray<T>::operator=(const myarray<T>& a)
  62. {
  63.         if(this->array != NULL)
  64.         {
  65.                 delete [] this->array;//调用类的析构函数不能用free
  66.                 this->array = NULL;
  67.         }
  68.         this->array = new T[a.lenth];
  69.         this->lenth = a.lenth;

  70.         for(int i=0;i<a.lenth;i++)
  71.         {
  72.                 *(this->array+i) = *(a.array+i);//元素对象复制调用对象的=操作符重载
  73.         }

  74.         return *this;
  75. }

  76. template <typename T>
  77. T& myarray<T>::operator[](int ind)
  78. {
  79.         if(ind>=this->lenth)
  80.         {
  81.                 exit(10);
  82.         }
  83.         return *(this->array+ind);
  84. }


点击(此处)折叠或打开

  1. 测试
  2. /*************************************************************************
  3.     > File Name: main.cpp
  4.     > Author: gaopeng QQ:22389860 all right reserved
  5.     > Mail: gaopp_200217@163.com
  6.     > Created Time: Mon 10 Apr 2017 08:31:57 AM CST
  7.  ************************************************************************/

  8. #include<iostream>
  9. #include<stdlib.h>
  10. #include<string.h>
  11. #include"arra.cpp"

  12. using namespace std;

  13. class test
  14. {
  15.         private:
  16.                 int a;
  17.                 int b;
  18.                 char* myc;
  19.         public:
  20.                 test()
  21.                 {
  22.                         a = 0;
  23.                         b = 0;
  24.                         myc = NULL;
  25.                 }
  26.                 test(const test& a)
  27.                 {
  28.                         this->a = a.a;
  29.                         this->b = a.b;
  30.                         this->myc = (char*)calloc(strlen(a.myc)+1,0);
  31.                         strcpy(this->myc,a.myc);
  32.                 }


  33.                 friend ostream& operator<<(ostream& out,test& a)
  34.                 {
  35.                         out<<a.a<<endl;
  36.                         out<<a.b<<endl;
  37.                         cout<<a.myc;
  38.                         return out;
  39.                 }
  40.                 ~test()
  41.                 {
  42.                         if(myc != NULL)
  43.                         {
  44.                                 free(myc);
  45.                                 myc = NULL;
  46.                         }
  47.                 }

  48.                 test& operator=(const test& a)
  49.                 {
  50.                         if(this->myc != NULL)
  51.                         {
  52.                                 free(this->myc);
  53.                                 this->myc = NULL;
  54.                         }
  55.                         this->a = a.a;
  56.                         this->b = a.b;
  57.                         this->myc = (char*)calloc(strlen(a.myc)+1,0);
  58.                         strcpy(this->myc,a.myc);
  59.                         return *this;
  60.                 }

  61.                 test& operator=(const char* a)
  62.                 {
  63.                         if(this->myc != NULL)
  64.                         {
  65.                                 free(this->myc);
  66.                                 this->myc = NULL;
  67.                         }
  68.                         if(a == NULL)
  69.                         {
  70.                                 this->myc = (char*)calloc(1,0);
  71.                                 return *this;
  72.                         }

  73.                         this->myc = (char*)calloc(strlen(a)+1,0);
  74.                         strcpy(this->myc,a);
  75.                         return *this;
  76.                 }

  77. };



  78. int main()
  79. {
  80.         myarray<test> a(3); //测试class类数组
  81.         a[0] = "asdasd";
  82.         a[1] = "test";
  83.         a[2] = "kkkk";

  84.         myarray<int> b(3); //测试int数组

  85.         b[0] = 1;
  86.         b[1] = 2;
  87.         b[2] = 3;

  88.         myarray<char> c(3); //测试char数组

  89.         c[0] = 'a';
  90.         c[1] = 'b';
  91.         c[2] = 'c';

  92.         myarray<test> d = a;//测试myarray拷贝构造函数

  93.         for(int i=0;i<3;i++)
  94.         {
  95.                 cout<<a[i]<<endl;
  96.                 cout<<d[i]<<endl;
  97.         }

  98.         for(int i=0;i<3;i++)
  99.         {
  100.                 cout<<b[i]<<endl;
  101.         }
  102.         for(int i=0;i<3;i++)
  103.         {
  104.                  cout<<c[i]<<endl;
  105.         }

  106. }



目录
打赏
0
0
0
0
91
分享
相关文章
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
2月前
|
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
74 19
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
63 13
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
61 5