before|正文之前:
c++实验代码及学习笔记(八)
你好! 这是一个高程实验课的代码记录及学习笔记。我将记录一些重要的知识点、易错点。但是作为大学生,水平很低,敬请指点教导、优化代码。
1问题
本次课我们学习了类的动态分配。类的动态分配与普通的malloc、free不同,取而代之的是new和delete。本质上非常相似,只是malloc、free不能调用构造与析构函数。所以创建对象数组时,我们要使用new和delete操作。
“应用任意大小和类型”,则用到了我们新学习的概念:模板。类的模板非常实用,充分体现了c++泛型编程、多态性的优越性。
同时自己实现一个动态数组类,则是对数组、运算符重载等知识的进一步巩固。
话不多说,咱们打板就唱 打码就上。
2精讲
模板
参考文章:精品【转】 C++模板详解
模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
使用模板的目的就是能够让程序员编写与类型无关的代码。它可以给出一种模板类型T,用于声明成员变量、形参等等,调用时注明所需类型(如int)就可以创建类模板对象。十分方便。
给出具体例子,简单明了:
1、类模板的格式为:
template<class 形参名,class 形参名,…> class 类名
{ … };
如
template<class T> //模板形参
class A //模板类的声明
{
public:
T a;
T b;
T hy(T c, T &d);
};
2、类模板对象的创建:比如一个模板类A,则使用类模板创建对象的方法为
A<int> m
在类A后面跟上一个<>尖括号并在里面填上相应的类型,这样的话类A中凡是用到模板形参的地方都会被int 所代替。当类模板有两个模板形参时创建对象的方法为A<int, double> m;类型之间用逗号隔开。
3、在类模板外部定义成员函数的方法为:
template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体},
template<class T1,class T2> void A<T1,T2>::h(){
}。
4、提醒注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。
实现一个数组类
首先,我们要构思这个类的成员数据和函数,实现什么功能,解决什么问题。
-
成员数据
数组的大小(精细一点可以区分数组的容量和数组实际大小)size
数组指针 *arr -
构造函数
含参构造函数,初始化,new数组
析构函数,delete对象,释放空间 -
运算符重载
=赋值
[ ]像正常数组那样使用对象数组 -
数组基本操作
分配内存、重定义数组大小、打印数组、增加减少插入元素(并未实现)
对指针合理初始化
内存管理:初始化指针
template <typename T>
class Array
{
private:
int _size;
T* arr;
public:
Array() :_arr(NULL), _size(0) //对指针合理初始化
{
}
Array(int size)
{
arr = new T[size];
_size = size;
if (!this->arr)
{
cout << "失败" << endl;