C++运算符重载详解

前提:C++运算符重载无疑是C++中既基础又实用的一种方式,但对于一个初学者来说又不那么容易搞清楚,个人感觉原因主要是:

1、运算符的类内重载和类外重载的区别 

2、一些如:const 、friend、inline关键字的用法不太熟悉


关注:简要介绍一下这几个关键字用法

inline:这里的所有inline关键字都可以取消(当然是在撇开inline的作用不谈),inline只是为了指定函数为内联函数,是表达式类宏定义的一种替代,他取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。关于宏定义的优缺点这里不作介绍。

friend:用friend定义的函数为友元函数,友元函数不是类的成员函数,但它需要在类的内部进行定义。作用是以一个非成员函数的身份访问非public成员函数

const:在本日志中两种含义:

1、bool operator==(const Sales_item &,const Sales_item &);//这里const说明传递过来的参数在函数内不可以改变.

2、bool same_isbn(const Sales_item &)const;//常成员函数, 常成员函数是不能改变成员变量值的函数。


主题:说了上面这么多之后,正式进入主题。

一、一元运算符(单目运算符),如:++、--

此类运算符重载在类成员函数重载不带参数,在类外重载需要带一个参数(也可以不带,这时候也是把类当做一个运算符,这时候需要带域操作符“ :: ”)

二、二元运算符(双目运算符),如:+、+=、=

此类运算符重载在类成员函数重载带一个参数(实际两个,另外一个是类本身),在类外重载需要带两个参数(也可以是一个,这时候也是把类当做一个运算符,这时候需要带域操作符“ :: ”)

三、三元运算符(三目运算符),a>b?a:b

此类运算符不能重载

四、特殊的二元运算符,如>>、<<

此类运算符和其他二元运算符一样,只不过要注意返回值和参数类型


注意:当非类成员函数在类外定义,要操作类中非Public成员变量,必须申明为类的友元函数

#ifndef SALES_ITEM_H_
#define SALES_ITEM_H_

#include <iostream>
#include <String>

/// Start class
class Sales_item
{
public:
Sales_item():units_sold(0),revenue(0.0){}
Sales_item(const std::string &book):isbn(book),units_sold(0),revenue(0.0){}
Sales_item(std::istream & in){in >> *this;}
virtual ~Sales_item(){}
double avg_price() const;
bool same_isbn(const Sales_item &)const;
bool same_units_sold(const Sales_item &)const;
bool same_revenue(const Sales_item &)const;

Sales_item & operator+=(const Sales_item &);
friend std::istream & operator>>(std::istream &,Sales_item &);
friend std::ostream & operator<<(std::ostream &,const Sales_item &);

// 二元运算符重载的成员函数只能有一个参数,所以不能放此处

// Sales_item operator+(const Sales_item &,const Sales_item &);
// bool operator==(const Sales_item &,const Sales_item &);
// bool operator!=(const Sales_item &,const Sales_item &);
private:
std::string isbn;
unsigned units_sold;
double revenue;
};
/// End class

Sales_item operator+(const Sales_item &,const Sales_item &);
bool operator==(const Sales_item &,const Sales_item &);
bool operator!=(const Sales_item &,const Sales_item &);

/// Class function
inline Sales_item & Sales_item::operator+=(const Sales_item & rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}

Sales_item operator+(const Sales_item & lhs,const Sales_item & rhs)
{
Sales_item ret(lhs);
ret += rhs;
return ret;
}

bool operator==(const Sales_item & lhs,const Sales_item & rhs)
{
return lhs.same_isbn(rhs) && lhs.same_units_sold(rhs) && lhs.same_revenue(rhs);
}

bool operator!=(const Sales_item & lhs,const Sales_item & rhs)
{
return !(lhs == rhs);
}

inline std::istream & operator>>(std::istream &in,Sales_item &s)
{
double price;
in >> s.isbn >> s.units_sold >>price;
if(in)
s.revenue = s.units_sold * price;
else
s = Sales_item();
return in;
}

inline std::ostream & operator<<(std::ostream &out,const Sales_item &s)
{
out << s.isbn << " " << s.units_sold << " " << s.revenue << " " << s.avg_price();
return out;
}

inline double Sales_item::avg_price() const
{
if(units_sold)
return revenue/units_sold;
else
return 0;
}

inline bool Sales_item::same_isbn(const Sales_item &rhs)const
{
return isbn == rhs.isbn;
}

inline bool Sales_item::same_units_sold(const Sales_item &rhs)const
{
return units_sold == rhs.units_sold;
}

inline bool Sales_item::same_revenue(const Sales_item &rhs)const
{
return revenue == rhs.revenue;
}
/// End class function

#endif


posted @ 2014-10-27 10:56  程序员丁  阅读(1116)  评论(0编辑  收藏  举报