C++常用的运算符重载例子
2018-11-04 18:18阅读:
正好在学习运算符重载,随后整理了一下,此处不介绍理论知识,只是把所学系统的整理了一下,提供了例子供大家参考,类的定义和main()函数见最后。
1.
加法运算符+重载
有两种方式(区别在于形参为一个还是两个):
(1)
作为类内的函数
在public中进行成员函数声明:
Sales_data
operator+(const
Sales_data& SD1);
在类外进行函数定义:
Sales_data
Sales_data::operator+(const
Sales_data&
SD1)
{
Sales_data
ret;
ret.price =
SD1
.price + price;
return
ret;
}
(2)
不作为类的成员函数:
将重载函数声明为该类的友元(是为了可使用类的private的成员变量)
friend Sales_data
operator+(const
Sales_data& SD1, const
Sales_data& SD2);
进行函数的定义:
Sales_data
operator+(const
Sales_data&
SD1, const
Sales_data&
SD2)
{
Sales_data
ret;
ret.price =
SD1.price +
SD2.price;
return
ret;
}
【注】此处Sales_data operator+(const
Sales_data& SD1, const Sales_data&
SD2)中的Sales_data后面并没有加&,是因为函数内部返回的是内部自己新建的一个对象,函数运行完就自动销毁了,所以不能用引用的方式。如果想用引用的方式,则需要对函数进行相应的修改,例如:
Sales_data&
Sales_data::operator+(const
Sales_data&
SD1)
{
price =
SD1.price + price;
return
*this;
}
2.
拷贝赋值运算符=(不区分在是否定义为类的成员函数)
在public中进行成员函数声明:
Sales_data&
operator=(const
Sales_data& SD1);
在类外进行函数定义:
Sales_data&
Sales_data::operator=(const
Sales_data&
SD1)
{
price =
SD1.price;
return
*this;
}
3.
复合赋值运算符+=(区分区分在是否定义为类的成员函数,与1同理)
此处以类的成员函数方式为例,在public中进行成员函数声明:
Sales_data&
operator+=(Sales_data
SD1);
在类外进行函数定义:
Sales_data&
Sales_data::operator+=(Sales_data
SD1)
{
price = price
+ SD1.price;
return
*this;
}
4.
重载输出运算符<<
【注】输出和输入运算符在重载的时候,不可作为类的成员函数,只能定义为普通函数。
在类内声明为友元函数:
friend ostream&
operator<<(ostream&
os, const Sales_data&
SD1);
函数定义:
ostream&
operator<<(ostream
&os,const
Sales_data&
SD1)
{
os << 'price: '
<<
SD1.price;
return os;
}
5.
重载输入运算符
>>
【注】对于输入运算符需要检测是否输入成功。
在类内声明为友元函数:
friend istream&
operator>>(istream&
is, Sales_data&
SD1);
函数定义:
istream&
operator>>(istream&
is,
Sales_data&
SD1)
{
is >>
SD1.price;
if
(is)
;//输入成功,进行xx操作
else
SD1 =
Sales_data();//输入失败,则对象被赋予默认的初始状态
return is;
}
6.
相等运算符 == 和不等运算符
!=
通常定义了==,就要定义!=运算符,不是严格必须,只是约定俗成。
在类内声明为友元函数:
bool
operator<</span>(Sales_data&
SD1);
bool
operator>(Sales_data&
SD1);
函数定义:
bool
Sales_data::operator<</span>(Sales_data&
SD1)
{
return price <</span>
SD1.price;
}
bool
Sales_data::operator>(Sales_data&
SD1)
{
return
(((*this) !=
SD1) &&
(!((*this) <</span>
SD1)));
}
一般常用的运算符重载就是这些,剩下的还有下标运算符、递增递减运算符(区分前置和后置,即++a和a++)、解引用和成员访问运算符,不太常用,就先不介绍了。
类:
class Sales_data
{
// friend Sales_data
operator+(const Sales_data& SD1, const Sales_data&
SD2);
friend ostream&
operator<<(ostream&
os, const Sales_data&
SD1);
friend istream&
operator>>(istream&
is, Sales_data&
SD1);
public:
Sales_data()
{}
Sales_data(double p)
:price(p) {}
// double show(Sales_data ret) {
return ret.price; }
double show() { return
price; }