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
- 重载运算与类型转换
- c++primer要点-重载运算与类型转换
- C++primer阅读笔记-----------重载运算与类型转换
- 重载、类型转换与运算符
- 第十四章 重载运算与类型转换
- c++ 重载运算与类型转换
- C++重载运算与类型转换
- 第十四章 重载运算与类型转换
- C++primer阅读笔记-重载运算与类型转换(可调用对象与function)
- 《C++primer(第五版)》学习之路-第十四章:重载运算与类型转换
- C++primer第五版笔记-第十四章重载运算与类型转换
- c++primer(第五版) 第十四章 重载运算与类型转换习题答案
- 《C++Primer》读书笔记——第14章 重载运算与类型转换
- c++primer第十四章重载运算与类型转换小结-14
- 转换构造函数与类型转换运算符重载
- 【C++】强制类型转换运算符的重载
- 类型转换运算符重载
- 重载类型转换运算符
- Toad导出数据字典,把数据库所有的表结构导出到htm中。(写文档很有用。)
- 实用:外出旅游日语大全
- linux mount使用方法
- 南方谷铺,父母的健康之源!
- CSharp中的委托
- C++重载运算与类型转换
- centos安装在线java环境。
- SVM/hinge loss function
- 关于出现logger的警告解决方法
- php常用的字符串处理函数
- Docker学习与总结
- C# socket 发送接收消息与发送接收文件 群发文件
- Redis 通讯协议分析
- extjs4 分页工具栏pagingtoolbar的每页显示数据combobox下拉框