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

来源:互联网 发布:linux vi复制粘贴命令 编辑:程序博客网 时间:2024/06/16 00:18

输入输出运算符重载

  • 在此只写一个输入输出运算符重载的例子,输入也是一样。
  • 注意:需要用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;}

其他

0 0