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. 安全测试---AWVS简单安装介绍

    使用AWVS对域名进行全局分析,深入探索: 首先,介绍一下AWVS这个工具. Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的网络漏洞扫描工具,它通过网 ...

  2. 支付机构MRC模

    一.电商RFM模型 RFM模型是一个简单的根据客户的活跃程度和交易金额贡献所做的分类.因为操作简单,所以较为常用. 近度R:R代表客户最近的活跃时间距离数据采集点的时间距离,R越大,表示客户越久未发生 ...

  3. 让Eclipse代码自动完成!

    其实很多工具都实现了代码自动完成,Eclipse也不例外,默认的Eclipse代码自动完成是“Alt+/”,使用起来很不方便,我们可以修改成我们顺手的组合键,下面就开始修改: 一,连按两次“ctrl+ ...

  4. 24. 两两交换链表中的节点 leetcode

    题目: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你应该返回 ...

  5. “全栈2019”Java第五十六章:多态与字段详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. WordPress翻译更新失败解决方法

    编辑php的配置文件:php.ini,搜索并找到disable_functions: 删除disable_functions后面的scandir字符串,保存php.ini: 重载或重启php-fpm服 ...

  7. codis__通用的使用模式

    1,按功能模块分成不同的productName 参照 sample_user, sample_dynamic (见附件) sample_user.tar.gz,sample_dynamic.tar.g ...

  8. [转](译)KVO的内部实现

    转载自:http://www.cocoachina.com/applenews/devnews/2014/0107/7667.html   09年的一篇文章,比较深入地阐述了KVO的内部实现.   K ...

  9. mysql基础操作学习笔记(一)

    1前期准备: SQL语言包涵以下4个部分: (1)数据定义语言(DDL):包括DROP, CREATE, ALTER等语句 (2)数据操纵语言(DML):包括INSERT, UPDATE, DELET ...

  10. 进阶篇:5.1)极值法(Worst Case ,WC)

    本章目的:了解极值法,运用极值法: 1.极值法定义 极值法(WC,Worse Case):极值法是考虑零件尺寸最不利的情况,通过尺寸链中尺寸的最大值或最小值来计算关键尺寸的值: 计算公式: 2.极值法 ...