本帖最后由 鸦领主 于 2021-1-28 15:52 编辑
重载函数
a)重载函数的定义:在相同的声明域中的函数名相同的,而参数表列表不同的,即通过数的参数列表而唯一标识并且来区分函数的一种特殊的函数。
递归函数与循环语句的对比:
a)递归函数的功能跟循环语句的功能基本是一样的。
b)递归优点:代码更简洁清晰,可读性更好
c)递归缺点:由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。如果递归深度太大,系统就有可能撑不住
d)对于线性结构的遍历,推荐使用循环可以节省空间消耗。
e)对于非线性结构的变量,有的难于用循环取代递归函数,例如:对二叉树遍历或者对目录系统的遍历等等。
f)递归函数跟循环一样,要求一定要有结束条件,否则就是死递归。死递归比死循环更严重,不但消耗CPu空间而且会耗尽空间。
2.运算符重载
(),[],->,还有赋值运算符=必须把它们做成类成员函数
一般情况下,我们定义的类对象是没有办法互相运算的
比如:
load c1,c2;
c1+c2;//这样的情况是不允许的
但是我们可以用到operator+函数来实现后面的加号可以是任意运算符
load operator+(load& c1, load c2)
{
load c;
c.m_real = c1.m_real + c2.m_real;
c.m_imag = c1.m_imag + c2.m_imag;
return c;
}
int main()
{
load c1(2,5), c2(3,6);
c1 + c2;//operator+(c1, c2);
//可以直接写成c1+c2
return 0;
}
3.将CList类转换成std::list
#pragma once
typedef int Data;
struct SNode
{
Data data;
SNode* pPrev,* pNext;//前驱,后继
};
class CList
{
SNode* m_pHead, * m_pTail;//头节点,尾节点
int m_count; //计数
public:
class itrator
{
SNode* p;
public:
itrator(SNode* p)
{
this->p = p;
}
Data &operator*()
{
return p->data;
}
operator SNode* ()
{//类型自动转换 将itrator类型自动变成指针变量类型
return p;
}
itrator &operator++()//++
{
p = p->pNext;
return *this;
}
itrator operator++(int)//后++,int只是为了区分,不加引用是返回的是一个临时的变量
{
itrator p1=p;
p = p->pNext;
return p1;
}
itrator& operator--()
{
p = p->pPrev;
return *this;
}
itrator operator--(int)
{
itrator p1 = p;
p = p->pPrev;
return p;
}
};
CList();
~CList();
//单行函数可放如类里面,会直接转换成内联
itrator begin()//void* GetHeadPosition()
{//获取头节点
return m_pHead;
}
itrator end()//void* GetHeadPosition()
{//获取尾节点
return m_pHead;
}
Data size()//intGetCount()
{//获取有多少节点
return m_count;
}
void Clear();
void push_back(Data data);
void push_front(Data &data);
void Remove(itrator p);
};
从头插入的代码只是名字变了一下
int main()
{
list.push_back(55);
list.push_back(66);
list.push_back(77);
CList::itrator p = list.begin();//获取头节点,CList类中的itrator类的对象p
while (p)
{
cout << *p++ << endl;//*p是获取p节点的内容,++是下一个
}
return 0;
}
|