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 ...
随机推荐
- 虚拟机ping 不通主机,主机可ping 虚拟机解决方法
在VMware虚拟机里安装了CentOS的系统发现桥接模式Ping不通外网,Ping主机也ping 不通,但是主机可以ping 虚拟机. 百度了以下,原因是w10防火墙搞的鬼,解决办法有两种: 1.关 ...
- 【Selenium专题】WebDriver启动Chrome浏览器(一)
selenium操作chrome浏览器需要有ChromeDriver驱动来协助.一.什么是ChromeDriver?ChromeDriver是Chromium team开发维护的,它是实现WebDri ...
- 201621123012《Java程序设计》第13次学习总结
作业 - 13 网络 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系 ...
- Spring整合JPA时,为实体类添加@Entity注解时提示The type MultipartEntity is deprecated
这个情况是由于导入错了Entity包所导致的. 按住Alt+T时,会有两个关于@Entity的提示 org.hibernate.annotations.Entity 和 javax.persisten ...
- 洛谷P5211 [ZJOI2017]字符串(线段树+乱搞)
题面 传送门 题解 为什么大佬们全都是乱搞的--莫非这就是传说中的暴力能进队,乱搞能AC-- 似乎有位大佬能有纯暴力+玄学优化\(AC\)(不算上\(uoj\)的\(Hack\)数据的话--这要是放到 ...
- memcached服务
介绍 它是一套数据缓存系统或软件 用于动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升性能的效果,实际应用环境中多用于数据库的cache的应用.它是通过预分配指定的内存空间来存储数据 定 ...
- 如何在Linux下禁用IPv6
如何在Linux下禁用IPv6 echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 禁用IP ...
- KEY
typedef struct st_key { uint key_length; /* Tot length of key */ ulong flags; /* dupp key and pack f ...
- C#使用Redis的基本操作
一,引入dll 1.ServiceStack.Common.dll 2.ServiceStack.Interfaces.dll 3.ServiceStack.Redis.dll 4.ServiceSt ...
- 手把手教你在CentOS 7.4下搭建Zabbix监控(转)
Linux系统版本:CentOS 7.4 1.安装前需要先关闭selinux和firewall. 1.1 [root@zabbix ~]# vi /etc/selinux/config 将SELINU ...