重载操作符时将其声明为类成员还是非类成员的一个标准

本文详细解释了如何决定操作符应该作为类成员还是名字空间成员,包括不同操作符的适用场景及与类成员函数的对比。

      一般我们应该怎样决定把一个操作符声明为了类成员还是名字空间成员呢?在某些情况下,程序员是没有选择的余地。

1、如果一个重载操作符是类成员,那么只有当跟它一起被使用的左操作数是该类的对象时,它才被调用。如果该操作符的左操作数必须是其他的类型,那么重载操作符必须是名字空间成员。

2、C++要求,赋值(=)、下标([ ])、调用(())和成员访问箭头(->)操作符必须被定义为类成员操作。任何把这些操作符定义为名字空间成员的定义都会被标记为编译时刻错误。如果操作符的有个参数是类类型,那么可以将该操作符定义为名字空间成员。例如:

//错误:必须是类string的成员
char& operator[](string&, int i) ;

//正确:是类string的成员
char& operator[](int i) const ;

//将等于(==)操作符声明为类成员
bool operator ==(const string& str) const ;
//因为==操作符有一个参数是string类型,则可以将其声明为名字空间类型。
bool operator ==(const string& str1,const string& str2) ;

3、重载的操作符声明为成员函数与声明为非成员的区别:

//将递增和递减操作符声明为类Screen的成员函数
class ScreenPtr
{
public:
	Screen& operator++() ;    //前置操作符
	Screen& operator--() ; 

	Screen& operator++(int) ; //后置操作符
	Screen& operator--(int) ; 
	// ...
};

//将递增和递减操作符声明为类Screen的非成员函数
class ScrennPtr
{
public:
	friend Screen& operator++( ScreenPtr& ) ;   //前置操作符
	friend Screen& operator--( ScreenPtr& ) ;

	friend Screen& operator++( Screen&, int ) ; //后置操作符
	friend Screen& operator--( Screen&, int ) ;
};

       从上面的例子中,我们可以看到重载操作符时将其声明为非成员函数时,需要在其操作符后面的参数表中需声明调用该操作符的对象,而将其声明为成员函数时,则不用在其操作符的参数表声明调用其的对象。因为该重载操作符的函数是类的成员函数,那么成员函数的调用是由该类的对象来调用。所以不用另外再声明了。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值