什么是C++的运算符重载
什么情况下要用到运算符重载
为了解释上面的问题我们先来看看这样一个简单地例子:
#include<iostream>
using namespace std;
int main()
{
int a = 1;
int b = 1;
cout << a + b << endl;
return 0;
}
我们很容易实现对两个基本数据类型int 或double 类型对象的加减操作
那么现在我们试想一下如果我们要进行加减操作的对象不是基本的数据类型而是两个对象,那我们该使用什么办法呢?
#include<iostream>
using namespace std;
class CBook
{
private:
int m_iPage;//这是看书的页数
public:
//有参构造函数
CBook(int page)
{
m_iPage = page;
}
//定义成员函数实现将你我看书的页数相加
int add(CBook a)
{
return m_iPage + a.m_iPage;
//当前的m_iPage+我们传入的参数a.m_iPage
}
};
int main()
{
CBook you(100);
CBook me(100);
cout << you.add(me) << endl;
return 0;
}
从上面的代码中可以看出我们可以通过成员函数的方式来对两个对象进行相加,但是成员函数的方式来实现这个对象相加的功能太单一,并且不利于代码的重复利用,我们定义多少个类型的相加就要定义多少个成员函数,因此我们用重载运算符的方法来解决这个问题
重载运算符的声明与规则:
#include<iostream>
using namespace std;
class CBook
{
private:
int m_iPage;
public:
CBook(int page)
{
m_iPage = page;
}
CBook operator+(CBook b)
{
return CBook(m_iPage + b.m_iPage);
}
//写完对对象的重载运算符之后我们的对象就可以像整数一样相加了
void display()
{
cout << m_iPage << endl;
}
//定义一个输出函数
};
int main()
{
CBook you(100);
CBook me(200);
CBook sum = you + me;
sum.display();
return 0;
}
下面我们来实现用运算符重载实现对象与整形数据相加:
#include<iostream>
using namespace std;
class CBook
{
public:
int m_pages;
void print()
{
cout << m_pages << endl;
}
CBook operator+(const int a)
{
CBook b;
b.m_pages = m_pages + a;
return b;
}//注意这里要返回的是一个对象
};
int main()
{
CBook one;
one.m_pages = 100;
CBook two;
two = one + 20;
two.print();
return 0;
}
我们有两种方式可以实现将整形数据赋值给对象:1、运算符重载 2、重载构造函数(有参构造函数)
int main()
{
CBook one;
one = 100;//如果没有运算符重载,则会报错,我们不能直接把
//整形数据赋值给对象
return 0;
}
第一种方法:重载构造函数
#include<iostream>
using namespace std;
class CBook
{
public:
int m_pages;
void print()
{
cout << m_pages << endl;
}//成员函数
CBook()
{
m_pages = 0;
}//无参构造函数
CBook(int page)
{
m_pages = page;
}//重载构造函数,有参构造函数
};
int main()
{
CBook one;
one = 200;
cout << one.m_pages<< endl;
one.print();
return 0;
}
第二种方法:运算符重载
#include<iostream>
using namespace std;
class CBook
{
public:
int m_pages;
void print()
{
cout << m_pages << endl;
}//成员函数
CBook()
{
m_pages = 0;
}//无参构造函数
void operator=(const int a)
{
m_pages = a;
}//重载等号运算符实现用整形数据对对象赋值
};
int main()
{
CBook one;
one = 999;
one.print();
return 0;
}
运算符重载实现自增自减(++,--分前置后置)运算:
#include<iostream>
using namespace std;
class CBook
{
public:
int m_pages;
void print()
{
cout << m_pages << "\t";
}//成员函数
CBook()
{
m_pages = 0;
}//无参构造函数
CBook& operator++()
{
++m_pages;
return *this;//表示返回当前对象
}//前置自增有引用无参数
//因为我们传进来0然后通过引用返回++后的值(用引用改变实参中变化的值)
CBook operator++(int a)
{
CBook b(*this);//*this表示返回的是当前对象的值
//设定一个临时对象来纪录修改前的对象
//后置自增传入1输出1但是偷偷加了一个1
//我们再次输出时值就变成了2
m_pages++;
return b;
}//后置自增无引用有参数
//传进来的值是1传出去也是1因此不需要引用 参数是格式规定
};
int main()
{
CBook one;
(++one).print();
(one++).print();
(one).print();
(one++).print();
one.print();//输出结果:1 1 2 2 3
return 0;
}