查看: 550|回复: 1

[原创图文] C++重载函数 运算符重载 将CList类转换成std::list类

[复制链接]

35

主题

47

帖子

3

精华

解密专家

Rank: 16

学币
380
荣耀
0
rank
0
违规
0
发表于 2021-1-27 17:24:12 | 显示全部楼层 |阅读模式
本帖最后由 鸦领主 于 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;
}




温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
学逆向论坛-免费的逆向学习论坛
发表于 2021-1-27 18:43:57 | 显示全部楼层
重载函数,比较难的是运算符重载
论坛交流群:672619046
关闭

论坛公告上一条 /1 下一条

快速回复 返回顶部 返回列表