鸦领主 发表于 2021-1-27 17:24:12

C++重载函数 运算符重载 将CList类转换成std::list类

本帖最后由 鸦领主 于 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;
}



roger 发表于 2021-1-27 18:43:57

重载函数,比较难的是运算符重载
页: [1]
查看完整版本: C++重载函数 运算符重载 将CList类转换成std::list类