目录
1.运算符重载概念
2.加号运算符重载
比方说,有一个名称为person的类,里面有m_A和m_B这两个成员
我们想实现它们相加的操作,可以写这样一个函数
我们只需要将函数名替换为operator+
就可以对加号运算符进行重载,简化代码
也可以通过全局函数重载
通过全局函数重载
代码示例:
#include<bits/stdc++.h>
using namespace std;
class person
{
public:
//成员函数重载+运算符
// person operator+(person &p)
// {
// person temp;
// temp.a = this -> a + p.a;
// temp.b = this -> b + p.b;
// return temp;
// }
int a;
int b;
};
//全局函数重载加号运算符
person operator+(person &p1,person &p2)
{
person temp;
temp.a = p1.a + p2.a;
temp.b = p1.b + p2.b;
return temp;
}
int main()
{
person p1;
p1.a = 5;
p1.b = 10;
person p2;
p2.a = 3;
p2.b = 9;
person p3 = p1 + p2;
cout << p3.a << endl;
cout << p3.b << endl;
return 0;
}
3.左移运算符重载
如果要输出私有成员可以配合友元
只能用全局函数进行重载
cout是标准输出流对象,ostream
代码示例:
#include<bits/stdc++.h>
using namespace std;
class person
{
public:
//成员函数重载
int a;
int b;
};
//全局函数重载
ostream & operator<<(ostream &cout,person &p){
cout << p.a << endl;
cout << p.b << endl;
return cout;
}
int main()
{
person p;
p.a = 5;
p.b = 10;
cout << p << endl;
return 0;
}
4.递增运算符重载
cout << ++a是先让a加一,再执行这个表达式
cout << a++是先执行这个表达式,再让a加一
代码示例:
#include<bits/stdc++.h>
using namespace std;
class integer
{
public:
integer(){
num = 0;
}
//重载前置++运算符
//返回&引用是为了一直对一个数据进行递增操作
integer & operator++()
{
num++;
return *this;
}
//重载后置++运算符
//int是一个占位参数
//可以用于区分前置和后置递增
integer operator++(int)
{
integer temp = *this;
num++;
return temp;
}
int num;
};
//后面的i前面不用&,不然写in++的时候会报错
//因为返回的是temp,temp是局部变量
ostream & operator<<(ostream &cout,integer i){
cout << i.num << endl;
return cout;
}
int main(){
integer i;
cout << ++(++i) << endl;
integer in;
cout << in++ << endl;
cout << in << endl;
return 0;
}
5.赋值运算符重载
深拷贝
这里涉及到深浅拷贝的问题
不懂的可以看http://t.csdnimg.cn/FHNI4
代码示例:
#include<bits/stdc++.h>
using namespace std;
class person
{
public:
person(int a)
{
age = new int(a);
}
~person()
{
if(age != NULL)
{
delete age;
age = NULL;
}
}
//返回引用才是它真正的自身
person& operator=(person &p)
{
//编译器提供的是浅拷贝
//age = p.age;
//应该先判断是否有属性在堆区
//如果有,先释放干净
//再进行深拷贝
if(age != NULL)
{
delete age;
age = NULL;
}
age = new int(*p.age);
return *this;
}
int *age;
};
int main()
{
person p1(18);
person p2(20);
person p3(22);
p3 = p2 = p1;
cout << *p1.age << endl;
cout << *p2.age << endl;
cout << *p3.age << endl;
return 0;
}
6.关系运算符重载
代码示例:
#include<bits/stdc++.h>
using namespace std;
class person
{
public:
person(string name,int age)
{
this -> name = name;
this -> age = age;
}
bool operator==(person &p)
{
if(this -> name == p.name && this -> age == p.age)
return true;
else
return false;
}
string name;
int age;
};
int main()
{
person p1("xiaoming",18);
person p2("xiaoming",18);
if(p1 == p1)
{
cout << "p1与p2相等" << endl;
}
return 0;
}
7.函数调用运算符重载
匿名函数对象
特点为:当前行执行完后立即被释放
int main()
{
test p;
p("hello world");
p(5,6);
//匿名函数对象
test()("hello world !!!");
test()(7,9);
return 0;
}
代码示例:
#include<bits/stdc++.h>
using namespace std;
class test
{
public:
void operator()(string test)
{
cout << test << endl;
}
void operator()(int a,int b){
cout << a+b << endl;
}
};
int main()
{
test p;
p("hello world");
p(5,6);
//匿名函数对象
test()("hello world !!!");
test()(7,9);
return 0;
}