C++重载运算与类型转换
2016-11-11 16:30
162 查看
输入输出运算符重载
在此只写一个输入输出运算符重载的例子,输入也是一样。注意:需要用
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; }
其他
相关文章推荐
- c++课程设计 对日期及时间的基本运算(时间类和日期类) 使用重载
- C++语法基础--重载运算操作符
- 《C++Primer》读书笔记——第14章 重载运算与类型转换
- C++中的重载运算
- c++不能重载的运算符
- C++运算重载
- C++ 学习笔记(14)重载运算与类型转换、函数对象、function库
- (未完成)C++ 重载家法运算函数 operator+
- C++输出运算重载为成员函数
- C++学习笔记【第三部分第十四章:重载运算与类型转换】
- c++实现重载分数的四则运算
- C++ 运算重载
- C++之运算符的重载实现大数的运算
- (未完成)C++ 重载赋值运算函数 operator =
- c++ 重载运算与类型转换
- C++运算符号重载
- C++ : 复数运算“<<”函数重载和“+”、“—”重载
- 第十四章 重载运算与类型转换
- C++重载string类的+=运算符号
- 【C++】重载运算符号时的函数返回值类型问题