C++Array类模板

函数模板和类模板都属于泛型技术,利用函数模板和类模板来创建一个具有通用功能的函数和类,以支持多种不同的形参,从而进一步简化重载函数的函数体设计。

声明方法:template<typename/class 标识符(T)>

函数声明(通用形参使用标识符(T)代替)

//Array.h
#ifndef ARRAY_H
#define ARRAY_H
#include<cassert> template<class T>
class Array
{
private:
T* m_list;
int m_size; public:
//构造函数
Array(int sz=);
//拷贝构造函数
Array(const Array<T>&a);
//析构函数
~Array();
//重载“=”可以让数组对象整体赋值
Array<T>& operator=(const Array<T>& rhs);
//重载“[]”使Array对象可以索引指定位置数据
T& operator[](int i); //此处必须返回引用,若返回值,则无法直接进行运算,变量使用完毕后便被销毁
//“[]”针对const的重载
const T& operator[](int i) const;
//重载T*类型转换
operator T*();
//“T*”针对const的重载
operator const T*() const;
//获取数组大小
int getSize() const;
//改变数组大小
void resize(int sz);
}; template<class T>
Array<T>::Array(int sz)
{
assert(sz);
m_size=sz;
m_list=new T[m_size];
} template<class T>
Array<T>::Array(const Array<T>& a)
{
//浅复制
m_size=a.m_size;
m_list=a.m_list;
//深复制
m_size=a.m_size;
m_list=new T[m_size];
for (int i = ; i < m_size; i++)
{
m_list[i]=a.m_list[i];
}
} template<class T>
Array<T>::~Array()
{
delete[] m_list;
} template<class T>
Array<T>& Array<T>::operator=(const Array<T>& chs)
{
if (&chs!=this)
{
if (chs.m_size!=this.m_size)
{
delete[] m_list;
m_size=chs.m_size;
m_list=new T[m_size];
}
for (int i = ; i < m_size; i++)
{
this.m_list[i]=chs.m_list[i];
}
}
return *this;
} template<class T>
//此处引用有两点:1.不能返回临时变量,否则引用无值索引;2.此处必须为引用,若为值类型,操作数必须为左值。
T& Array<T>::operator[](int i)
{
assert(i>=&&i<m_size);
//有待测试
/*T temp=m_list[i];
return temp;*/
return m_list[i];
} template<class T>
Array<T>::operator T*()
{
return m_list;
} template<class T>
int Array<T>::getSize() const
{
return m_size;
} template<class T>
void Array<T>::resize(int sz)
{
assert(sz>=);
if (sz==m_size)
{
return;
}
else
{
T* Newlist=new T[sz];
int n=(m_size<sz)?m_size:sz;
for (int i = ; i < n; i++)
{
Newlist[i]=m_list[i];
}
delete[] m_list;
m_list=Newlist;
m_size=sz;
delete[] Newlist;
}
}
#endif

在本次我编写的Array类模板中,可以看出类模板的本质还是函数模板构成的。同时,在此次编写类模板的过程中,深刻地体会了C++的三个知识点。

分别是拷贝构造函数的深复制与浅复制成员函数与非成员函数运算符重载返回值与返回引用的区别。接下来,将详细说这三个知识点。

  1. 拷贝构造函数的深复制与浅复制:拷贝构造函数,是以对象的引用作为形参,并用const常量约束。若对象为头指针和线性空间存储数据的形式,浅复制,则是只复制了头指针和空间大小,而未真正意义上实现线性空间的数据复制;而深复制,则将被复制对象的线性空间所有的数据依次赋予对象。
  2. 成员函数运算符重载和非成员函数运算符重载的区别:成员函数在二目运算符中,只需要一个形参,另外一个为本对象的this指针;而非成员函数在二目运算符中,则需要两个形参。
  3. 返回值与返回引用的区别:返回值,即生成了return变量的拷贝,在使用后,临时变量就将被销毁。因此,返回值后不能做左值运算。返回引用,即生成对return变量的别名,可对此变量操作,进行左值运算。但返回引用,返回的不能是临时变量,必须是类成员变量局部静态变量传入的引用形参

C++Array类模板编写笔记的更多相关文章

  1. 《C++ Primer Plus》14.4 类模板 学习笔记

    14.4.1 定义类模板下面以第10章的Stack类为基础来建立模板.原来的类声明如下:typedef unsigned long Item; class Stack{private:    enum ...

  2. 初步C++类模板学习笔记

    类模板 实现:在上课时间的定义给它的一个或多个参数,这些参数代表了不同的数据类型.                              -->抽象的类. 在调用类模板时, 指定參数, 由编 ...

  3. 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

    第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...

  4. C++学习笔记:09 函数模板与类模板

    课程<C++语言程序设计进阶>清华大学 郑莉老师) 引入 考虑一个求绝对值函数myabs,对于int,double,float等数据类型需要重载多次,编写多个函数体.函数体逻辑代码完全一致 ...

  5. C++学习笔记47:链表的概念与结点类模板

    学堂在线学习笔记 链表的概念与结点类模板 顺序访问的线性群体--链表类 链表是一种动态数据结构,可以用来表示顺序访问的线性群体: 链表是由系列结点组成,结点可以在运行时动态生成: 每一个结点包括数据域 ...

  6. c++中的类(class)-----笔记(类模板)

    1,一个模板类至少具有一个类参数,类参数是个符号以表示将要被某个确定数据类型代替的类型. #include<iostream> #include<string> using n ...

  7. c++类模板分文件编写存在的问题

    c++分文件编写的编译机制: 各个文件独立编译,如果在某.cpp文件中出现了函数调用,但是在此.cpp文件并没有对应函数的实现.此时就会在函数调用出生成特定的符号,在之后的链接过程完成函数调用. C+ ...

  8. c++类模板之分文件编写问题及解决

    我们在实际项目中一般习惯头文件(.h)和源文件(.cpp)分开写,这样做的好处良多,但是如果遇到了类模板,这样可能会有一点儿问题. 我们通过一个例子来看: person.h: #pragma once ...

  9. C++学习笔记36:类模板

    类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typenam ...

随机推荐

  1. python基本算法

    算法优劣评判标准 时间复杂度: 定义:用来评估算法运行效率的一个式子 print('Hello World') O(1) for i in range(n): print('Hello World') ...

  2. Chat Order (map映射)

     Chat Order Time Limit:3000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit ...

  3. [Swift]堆栈Stack的两种版本:(1)用类包装Stack (2)用泛型包装Stack

    堆栈是一个在计算机科学中经常使用的抽象数据类型.堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列. 堆栈中定义了一些操作. 两个最重要的 ...

  4. 基于Java软引用机制最大使用JVM堆内存并杜绝OutOfMemory

    题记:说好的坚持一周两篇文章在无数琐事和自己的懒惰下没有做好,在此表达一下对自己的不满并对有严格执行力的人深表敬意!!!! -------------------------------------- ...

  5. python中package机制的两种实现方式

    当执行import module时,解释器会根据下面的搜索路径,搜索module1.py文件. 1) 当前工作目录 2) PYTHONPATH中的目录 3) Python安装目录 (/usr/loca ...

  6. P3366 (模板)最小生成树

    2019-01-30 最小生成树基本算法 定义: 给定一个边带权的无向图G=(V,E),n=|V|,m=|E|,由V中全部n个定点和E中n-1条边构成的无向连通子图被称为G的一颗生成树. 边的权值之和 ...

  7. P1975 [国家集训队]排队 线段树套平衡树维护动态逆序对查询

    $ \color{#0066ff}{ 题目描述 }$ 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和. 红星幼儿园的小朋友们排起了长长地队伍 ...

  8. KVO 使用及原理

    KVO的基本原理大概是这样的   当一个对象被观察时, 系统会新建一个子类NSNotifying_A ,在子类中重写了对象被观察属性的 set方法,  并且改变了该对象的 isa 指针的指向(指向了新 ...

  9. centsos 查看系统版本信息

    [root@hostuser gitlab]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cx ...

  10. POJ 2253 Frogger ,poj3660Cow Contest(判断绝对顺序)(最短路,floyed)

    POJ 2253 Frogger题目意思就是求所有路径中最大路径中的最小值. #include<iostream> #include<cstdio> #include<s ...