新浪博客

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)));
}
一般常用的运算符重载就是这些,剩下的还有下标运算符、递增递减运算符(区分前置和后置,即++aa++)、解引用和成员访问运算符,不太常用,就先不介绍了。
类:

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; }

我的更多文章

下载客户端阅读体验更佳

APP专享