“++” 和 “--” 的重载

本文介绍了在C++ 2.1及更高版本中如何通过成员函数和友元函数重载前缀和后缀自增运算符"++"和自减运算符"--"。区别在于是否在运算符函数参数中加入int关键字来区分前缀和后缀形式。并给出了使用成员函数和友元函数的实例。

自增运算符 “++” 和自减运算符 “- -” 放置在变量的前面与后面,其作用是有区别的。

  在 C++ 2.1 之前的版本在重载“++”(或“- -”)时,不能显式地区分是前缀方式还是后缀方式。也就是说,下面的两条语句是完全相同的:

ob++;
++ob;

  在 C++ 2.1 及以后的版本中,C++ 编译器可以通过在运算符函数参数表中是否插入关键字 int 来区分这两种方式。
  对于前缀方式 ++ob,可以用运算符函数重载为:

ob.operator++();		//成员函数重载

operator++(X &ob);	//友元函数重载,其中 ob 为 X 类对象的引用

  对于后缀方式 ob++,可以用运算符函数重载为:

ob.operator++(int);		//成员函数重载

operator++(X &ob,int);	//友元函数重载,其中 ob 为 X 类对象的引用

调用时,参数 int 一般被传递给值 0,例如:

class X{
   
   
	···
	public:
	···
	X.operator++();		//前缀方式
	X.operator++(int);		//后缀方式
	```
};
int main(){
   
   
	X ob;
	···
	++ob;	//隐式调用 ob.operator++()
	ob++;	//隐式调用 ob.operator++(int)
	ob.operator++();
	//显式调用隐式调用 ob.operator++(),指++ob
	ob.operator++(0);	
	//显式调用隐式调用 ob.operator++(),指ob++
	···
	return 0;
}

类似地,也可重载为友元函数,例如:

	···
	class Y(){
   
   
	···
	friend operator++(Y&);	//前缀方式
	friend operator++(Y&,int
类的前置后置自增(`++`)、自减(`--`)运算符重载主要有以下区别: ### 语法形式 - **前置运算符重载**:返回引用,函数参数为空。以自增运算符为例,函数声明形式为 `T& operator++();`。 - **后置运算符重载**:返回值,函数带有一个 `int` 类型的占位参数。以自增运算符为例,函数声明形式为 `T operator++(int);`。 ### 操作语义 - **前置运算符**:先对对象进行自增或自减操作,然后返回修改后的对象本身。 - **后置运算符**:先保存对象的原始状态,再对对象进行自增或自减操作,最后返回对象的原始状态。 ### 代码示例 ```cpp #include <iostream> class Counter { private: int value; public: Counter(int val = 0) : value(val) {} // 前置自增运算符重载 Counter& operator++() { ++value; return *this; } // 后置自增运算符重载 Counter operator++(int) { Counter temp = *this; ++(*this); return temp; } // 前置自减运算符重载 Counter& operator--() { --value; return *this; } // 后置自减运算符重载 Counter operator--(int) { Counter temp = *this; --(*this); return temp; } int getValue() const { return value; } }; int main() { Counter c(5); // 前置自增 Counter preInc = ++c; std::cout << "Pre-increment: " << preInc.getValue() << std::endl; // 后置自增 Counter postInc = c++; std::cout << "Post-increment: " << postInc.getValue() << std::endl; // 前置自减 Counter preDec = --c; std::cout << "Pre-decrement: " << preDec.getValue() << std::endl; // 后置自减 Counter postDec = c--; std::cout << "Post-decrement: " << postDec.getValue() << std::endl; return 0; } ``` ### 性能差异 - **前置运算符**:由于直接修改对象并返回引用,避免了创建临时对象,通常性能较高。 - **后置运算符**:需要创建一个临时对象来保存原始状态,会有额外的对象创建销毁开销,性能相对较低。 ### 链式调用 - **前置运算符**:返回引用,可以进行链式调用,例如 `++(++obj);`。 - **后置运算符**:返回值,不能进行链式调用,因为返回的是临时对象,临时对象是右值,不能作为左值使用。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值