C++Array类模板编写笔记
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++的三个知识点。
分别是拷贝构造函数的深复制与浅复制,成员函数与非成员函数运算符重载,返回值与返回引用的区别。接下来,将详细说这三个知识点。
- 拷贝构造函数的深复制与浅复制:拷贝构造函数,是以对象的引用作为形参,并用const常量约束。若对象为头指针和线性空间存储数据的形式,浅复制,则是只复制了头指针和空间大小,而未真正意义上实现线性空间的数据复制;而深复制,则将被复制对象的线性空间所有的数据依次赋予对象。
- 成员函数运算符重载和非成员函数运算符重载的区别:成员函数在二目运算符中,只需要一个形参,另外一个为本对象的this指针;而非成员函数在二目运算符中,则需要两个形参。
- 返回值与返回引用的区别:返回值,即生成了return变量的拷贝,在使用后,临时变量就将被销毁。因此,返回值后不能做左值运算。返回引用,即生成对return变量的别名,可对此变量操作,进行左值运算。但返回引用,返回的不能是临时变量,必须是类成员变量或局部静态变量或传入的引用形参。
C++Array类模板编写笔记的更多相关文章
- 《C++ Primer Plus》14.4 类模板 学习笔记
14.4.1 定义类模板下面以第10章的Stack类为基础来建立模板.原来的类声明如下:typedef unsigned long Item; class Stack{private: enum ...
- 初步C++类模板学习笔记
类模板 实现:在上课时间的定义给它的一个或多个参数,这些参数代表了不同的数据类型. -->抽象的类. 在调用类模板时, 指定參数, 由编 ...
- 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板
第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...
- C++学习笔记:09 函数模板与类模板
课程<C++语言程序设计进阶>清华大学 郑莉老师) 引入 考虑一个求绝对值函数myabs,对于int,double,float等数据类型需要重载多次,编写多个函数体.函数体逻辑代码完全一致 ...
- C++学习笔记47:链表的概念与结点类模板
学堂在线学习笔记 链表的概念与结点类模板 顺序访问的线性群体--链表类 链表是一种动态数据结构,可以用来表示顺序访问的线性群体: 链表是由系列结点组成,结点可以在运行时动态生成: 每一个结点包括数据域 ...
- c++中的类(class)-----笔记(类模板)
1,一个模板类至少具有一个类参数,类参数是个符号以表示将要被某个确定数据类型代替的类型. #include<iostream> #include<string> using n ...
- c++类模板分文件编写存在的问题
c++分文件编写的编译机制: 各个文件独立编译,如果在某.cpp文件中出现了函数调用,但是在此.cpp文件并没有对应函数的实现.此时就会在函数调用出生成特定的符号,在之后的链接过程完成函数调用. C+ ...
- c++类模板之分文件编写问题及解决
我们在实际项目中一般习惯头文件(.h)和源文件(.cpp)分开写,这样做的好处良多,但是如果遇到了类模板,这样可能会有一点儿问题. 我们通过一个例子来看: person.h: #pragma once ...
- C++学习笔记36:类模板
类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typenam ...
随机推荐
- 安全测试---AWVS简单安装介绍
使用AWVS对域名进行全局分析,深入探索: 首先,介绍一下AWVS这个工具. Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的网络漏洞扫描工具,它通过网 ...
- 支付机构MRC模
一.电商RFM模型 RFM模型是一个简单的根据客户的活跃程度和交易金额贡献所做的分类.因为操作简单,所以较为常用. 近度R:R代表客户最近的活跃时间距离数据采集点的时间距离,R越大,表示客户越久未发生 ...
- 让Eclipse代码自动完成!
其实很多工具都实现了代码自动完成,Eclipse也不例外,默认的Eclipse代码自动完成是“Alt+/”,使用起来很不方便,我们可以修改成我们顺手的组合键,下面就开始修改: 一,连按两次“ctrl+ ...
- 24. 两两交换链表中的节点 leetcode
题目: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你应该返回 ...
- “全栈2019”Java第五十六章:多态与字段详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- WordPress翻译更新失败解决方法
编辑php的配置文件:php.ini,搜索并找到disable_functions: 删除disable_functions后面的scandir字符串,保存php.ini: 重载或重启php-fpm服 ...
- codis__通用的使用模式
1,按功能模块分成不同的productName 参照 sample_user, sample_dynamic (见附件) sample_user.tar.gz,sample_dynamic.tar.g ...
- [转](译)KVO的内部实现
转载自:http://www.cocoachina.com/applenews/devnews/2014/0107/7667.html 09年的一篇文章,比较深入地阐述了KVO的内部实现. K ...
- mysql基础操作学习笔记(一)
1前期准备: SQL语言包涵以下4个部分: (1)数据定义语言(DDL):包括DROP, CREATE, ALTER等语句 (2)数据操纵语言(DML):包括INSERT, UPDATE, DELET ...
- 进阶篇:5.1)极值法(Worst Case ,WC)
本章目的:了解极值法,运用极值法: 1.极值法定义 极值法(WC,Worse Case):极值法是考虑零件尺寸最不利的情况,通过尺寸链中尺寸的最大值或最小值来计算关键尺寸的值: 计算公式: 2.极值法 ...