C++重载运算与类型转换

本文介绍C++中的运算符重载方法,包括输入输出运算符、前置和后置运算符的重载,并展示了如何使用函数对象及标准库定义的函数对象。此外,还提供了使用std::function定义函数列表的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入输出运算符重载

  • 在此只写一个输入输出运算符重载的例子,输入也是一样。
  • 注意:需要用friend修饰重载的函数
  • 代码

    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    #include<functional>  //bind
    #include<map>
    #include<set>
    #include<unordered_map>
    #include<memory>
    #include<assert.h>
    using namespace std;
    
    class OverLoad
    {
    public:
        int a;
        int b;
        string name;
        OverLoad(int ac, int bc, string n):a(ac), b(bc), name(n)
        {
        }
    
        friend ostream &operator<<(ostream &os, const OverLoad &ol)
        {
            os << ol.name << "'s info :"
                << " a : " << ol.a
                << ", b : " << ol.b << endl;
            return  os;
        }
    };
    
    int main()
    {
        cout << "start!" << endl;
    
        OverLoad ol(1,2,"test");
        cout << ol;
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
    
  • 参考文献:http://blog.163.com/hbu_lijian/blog/static/126129153201211553330531/

前置和后置运算符重载

  • 说明:重载前置运算符,不需要传递参数,而且不像输入输出那样要是友元函数;重载后置运算符,需要传入一个整型参数,和前置运算符区分开来,虽然这个参数没有任何意义。
  • 代码

    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    #include<functional>  //bind
    #include<map>
    #include<set>
    #include<unordered_map>
    #include<memory>
    #include<assert.h>
    using namespace std;
    
    class OverLoad
    {
    public:
        int a;
        int b;
        string name;
        OverLoad(int ac, int bc, string n):a(ac), b(bc), name(n)
        {
        }
    
        friend ostream &operator<<(ostream &os, const OverLoad &ol)
        {
            os << ol.name << "'s info :"
                << " a : " << ol.a
                << ", b : " << ol.b << endl;
            return  os;
        }
    
        OverLoad& operator++()
        {
            ++a;
            return *this;
        }
    
        const OverLoad operator++(int)
        {
            OverLoad ol = *this;
            ++(*this);
            return ol;
        }
    
    };
    
    int main()
    {
        cout << "start!" << endl;
    
        OverLoad ol(1,2,"test");
        cout << ++ol;
        cout << ol;
    
        cout << endl << endl;
        cout << ol++;
        cout << ol;
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
    

函数调用运算符

  • 含有状态的函数对象类:重载()符号,可以在类中添加其他成员,实现更多的功能,如输入输出等
  • 相当于将类当作一个函数,然后在()中填入需要传入的参数
  • 代码

    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    #include<functional>  //bind
    #include<map>
    #include<set>
    #include<unordered_map>
    #include<memory>
    #include<assert.h>
    using namespace std;
    
    class PrintStr
    {
    public:
        PrintStr(ostream &o = cout, char c = ' ') :os(o), sep(c)
        {
        }
    
        void operator()(const string &s) const
        {
            os << s << sep;
        }
    private:
        ostream &os;
        char sep;
    };
    
    int main()
    {
        cout << "start!" << endl;
    
        vector<string> vs = {"123", "456"};
        for_each(vs.begin(), vs.end(), PrintStr(cout, '\n'));
    
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
    

标准库定义的函数对象

  • plus<int>negate<int>
  • 代码

    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    #include<functional>  //bind
    #include<map>
    #include<set>
    #include<unordered_map>
    #include<memory>
    #include<assert.h>
    using namespace std;
    
    int main()
    {
        cout << "start!" << endl;
    
        plus<int> intAdd;
        negate<int> intNegate;
    
        cout << intAdd(10, 20) << endl;
        cout << intNegate(10) << endl;
    
    
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
    

C++primer 14.8.2练习

  • 题目
    • 统计大于1024的值有多少个
    • 找到第一个不等于pooh的字符串
    • 将所有的值乘以2
  • 代码

    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    #include<functional>  //bind
    #include<map>
    #include<set>
    #include<unordered_map>
    #include<memory>
    #include<assert.h>
    using namespace std;
    
    int main()
    {
        cout << "start!" << endl;
    
        vector<int> vec = {0, 1, 3, 5, 1024, 1029 ,3000, 6000};
        vector<string> vs = {"pooh", "ppph", "ppap"};
        cout << "bigger than 1024: " <<  count_if(vec.begin(), vec.end(), bind<int>(greater<int>(), std::placeholders::_1, 1024)) << endl;
        cout << "smaller than 1024: " << count_if(vec.begin(), vec.end(), bind<int>(greater<int>(), 1024, std::placeholders::_1)) << endl;
    
        cout << "first string that not equals to pooh: " << *find_if(vs.begin(), vs.end(), bind(not_equal_to<string>(), std::placeholders::_1, "pooh")) << endl;
    
        transform(vec.begin(), vec.end(), vec.begin(), bind(multiplies<int>(), std::placeholders::_1, 2));
    
        for_each(vec.begin(), vec.end(), [](int s) {cout << s << endl; });
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
    
  • 参考链接:http://www.2cto.com/kf/201604/500930.html

function定义函数列表

  • 说明:构造一个关于两个整形操作返回整型数据的映射列表
  • 代码

    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    #include<functional>  //bind
    #include<map>
    #include<set>
    #include<unordered_map>
    #include<memory>
    #include<assert.h>
    using namespace std;
    
    
    int intAdd(int n1, int n2)
    {
        return n1 + n2;
    }
    
    int main()
    {
        cout << "start!" << endl;
    
        function<int(int, int)> f1 = intAdd;
        cout << f1(1, 3) << endl;
    
        map<string, function<int(int, int)>> ops = {
            {"+", intAdd},
            {"-", std::minus<int>()},
            { "/", [](int i, int j){return i/j; } },
            { "*", [](int i, int j){return i*j; } },
        };
    
        cout << ops["/"](10, 2) << endl;
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
    

其他

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

littletomatodonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值