总结
- 讲了模板类,这是在原基础上把对象类型抽离出来,变成template<typename 占位符>这种形式。
- 然后怎么定义模板类,模板成员函数,和定义一般模板函数大同小异,抽离出来类型就可以,注意别忘把类型抽离出来,然后注意不该改成模板类型的别改成模板类型(比如大小、长度,这只能是整数,名字,这只能是string型)
- 关于模板样式的形参,写这样的形式:const 模板类型名& 形参名,因为模板类型也许是内置类型也许是class类型,这样的格式避免复制所带来巨大的开销,使程序效率降低。
- 模板参数可以是<类型名 变量名(可以=默认参数值)>这种形式。
- 模板类最好搭配着模板模板函数。
返回类型 函数名(*&参数名)
,这里的*&可以让我们修改形参指针本身,也可以修改形参指针所指的对象。
课后习题
6.1改写非模板类称为模板类
template<typename elemType>
class example{
public:
example(const elemType &min,const elemType &max);//一定要const加&,因为elemType不知道啥类型,
//万一是class类型,不加const和&就意味着传值传递以及可能被认为会改变形参,这将会造成程序可读性变差和效率降低。
example(const elemType *array,int size);
elemType& operator[](int index);//size、index这种不是想改变类型就改变类型的变量,就保持其原类型即可。
bool operator==(const example1&)const;
bool insert(const elemType*,int);
bool insert(const elemType&);
elemType min()const{
return _min;}
elemType max()const{
return _max;}
void min(const elemType&);
void max(const elemType&);
int count(const elemType &value)const;
private:
int size;//数组元素个数必须为整数,不可以是其他。
elemType *parray;
elemType _min;
elemType _max;
};
6.2 改写非模板类成模板类,并扩充其功能,使它能够通过堆内存来支持任意行列大小。分配/释放内存的操作,请在构造函数/析构函数中进行
我不知道咋回事,书上源代码也过不了。就直接搬源码来了。
#include <iostream>
#include <cassert>
using namespace std;
template <typename elemType>
class Matrix
{
friend Matrix<elemType>
operator+( const Matrix<elemType>&, const Matrix<elemType>& );
friend Matrix< elemType >
operator*( const Matrix<elemType>&, const Matrix<elemType>& );
public:
Matrix( int rows, int columns );
Matrix( const Matrix& );
~Matrix(){
delete [] _matrix; }
Matrix& operator=( const Matrix& );
void operator+=( const Matrix& );
elemType& operator