您的位置:首页 > 编程语言 > C语言/C++

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++primer