对于友元重载方式和成员函数重载方式的选择

今天看C++primier第五版494页下面有一段叙述:

  与iostream标准库库兼容的输入输出运算符必须是普通的非成员函数,而不能是类的成员函数。否则,它们的左侧运算对象将是我们类的一个对象。

  原因倒是非常简单,因为如果重载函数是作为类中的一个非静态成员的话,就必须通过一个已经被实例化的类来调用,如果仅仅是作为一个友元函数的话,那么直接调用就可以了。

  那么对于前者,很明显地可以知道的是由于是作为类中的一个非静态成员,自然也就有隐式定义的this指针,所以在定义和声明函数的时候,参数自然而然地就少了一个,但是引用该函数的时候就必须要划定该函数的作用域是在某个已经被实例化的域上。

  对于作为友元的后者,参数而言的话就多了一个。以位计算符的重载为例:

  首先是作为类成员函数:

#include<iostream>
using namespace std;
class Date{
    public:
        Date(){
        }
        Date(int y,int m,int d){
            year=y;
            month=m;
            day=d;
        }
    const Date& operator<<(const Date &d) const;
    private:
        int year,month,day;
    };
const Date& Date::operator <<(const Date& d) const
    {
        const char sep='\t';
        cout<<"year:"<<d.year<<sep<<"month:"<<d.month<<sep<<"day:"<<d.day<<endl;
        return *this; 
    }
int main(){
    Date b;
    Date a(2016,12,12);
    Date c(2011,11,11);
    b<<a<<c;
    return 0;
} 

看上述例子,为什么要返回this指针?原因很简单,这样我们像std命名空间的cout<<一样可以连续的使用,具体地话可以参见我之前转载的一片文章,记叙iostream中的库和stdio中标准输入输出的不同。

然后是友元函数的写法


#include<iostream>
using namespace std;
class Date{
public:
	Date(){
	}
	Date(int y,int m,int d){
		year=y;
		month=m;
		day=d;
	}
	friend ostream& operator<<(ostream &os,const Date &dt);
private:
	int year,month,day;
};
ostream& operator <<(ostream& os,const Date& d)
{
	const char sep='\t';
	os<<"year:"<<d.year<<sep<<"month:"<<d.month<<sep<<"day:"<<d.day<<endl;
	return os; 
}
int main(){
	Date a(2016,12,12);
	cout<<a;
	return 0;
}

  对于上述的问题,显然用友元的处理方式更加地科学,因为并没有必要为了使用重载后的运算符而提前实例化一个对象,在一些相关的运算符重载的问题上,最后我们应该选取何种方式来重载运算符呢?这个应该视具体情况和具体运算符而定。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值