首页 > 编程语言 >C++重载递增和递减运算符

C++重载递增和递减运算符

时间:2023-03-23 14:35:01浏览次数:39  
标签:high stone int 递增 C++ 运算符 重载

重载递增和递减运算符

在迭代器类中通常会实现递增运算符(++)和递减运算符(--),这两种运算符使得类可以在元素的序列中前后移动。C++语言并不要求递增和递减运算符必须是类的成员,但是因为它们改变的正好是所操作对象的状态,所以建议将其设定为成员函数。
对于内置类型来说,递增和递减运算符既有前置版本也有后置版本。同样我们也应该为类定义两个版本的递增和递减运算符。

定义递增运算符

在上面的代码中,我们首先在stone类中定义的前置递增,然后由定义了后置递增,因为这两个版本重载的是同一个符号,这就意味着重载版本所用的名字将是同一个,并且运算对象的数量和类型都相同。
这样当我们调用递增运算符的时候编译器将不知道该调用哪一个而报错。为了解决这一问题,后置版本接受一个额外的int类型的形参stone operator++ (int)
这个形参的唯一作用就是区分前置版本和后置版本的函数,而不是真的要在实现后置版本时参与运算。

这也是递增和递减运算符重载和其他运算符重载不同的地方,这一点尤为重要。

还有要注意的是后置版本的递增,要先使用这个值,然后在进行++的操作,所以在重载后置版本的时候要在函数里定义一个临时变量,用于函数的返回。而且这里的返回类型不能是return by reference,只能return by value,因为临时变量不能return by reference。

定义递减运算符

namespace jj02 {

	class stone {       //定义一个名为stone的类
	public:
		stone() :m_long(0), m_weigh(0), m_high(0) {}
		stone(int l, int w, int h)
			:m_long(l), m_weigh(w), m_high(h) {}

		const int& weigh() const { return m_weigh; }    //获取宽度
		const int& high() const { return m_high; }     //获取高度
		const int& mlong() const { return m_long; }     //获取长度

        //前置递增运算符重载
		stone& operator++  () {
			this->m_high += 1;
			return *this;
		}

        //后置递增运算符重载
		stone operator++ (int) {
			stone temp = *this;
			++(*this).m_high;
			return temp;
		}

		stone& operator = (const stone& st) {
			m_high = st.high();
			m_long = st.mlong();
			m_weigh = st.weigh();
		}
		

	private:
		int m_long, m_weigh, m_high;
	};


	void test02() {
		std::cout << "test02........." << std::endl;
		stone s1(1, 2, 3);
		stone s2(2, 3, 4);
		auto& s3 = my_min(s1, s2);
		std::cout << "m_weigh = " << s3.weigh() << std::endl;
		stone s4 = s2++; 
		std::cout <<s4.mlong()<< s4.weigh()<< s4.high() << std::endl;
		std::cout << s2.high() << std::endl;

	} 
}
int main() {

	
	jj02::test02();
	
	return 0;
}

定义递减运算符与之相似,不再陈述。下面是参考代码:

     //前置递减运算符重载
 	stone& operator--  () {
 		this->m_high -= 1;
 		return *this;
 	}

     //后置递减运算符重载
 	stone operator++ (int) {
 		stone temp = *this;
 		--(*this).m_high;
 		return temp;
 	}

End

标签:high,stone,int,递增,C++,运算符,重载
From: https://www.cnblogs.com/nakjima/p/17247333.html

相关文章

  • c++代码编译出错:undefined reference to `typeinfo for dnet::event_handler'
    编译出错信息如下:[82%]LinkingCXXexecutable../bin/dsys/usr/bin/ld:../lib/libdnet.so:undefinedreferenceto`typeinfofordnet::event_handler'collect2:er......
  • 【web 开发基础】PHP 快速入门(9)-PHP 运算符之位运算符详解
    前言PHP开发基础开速入门系列目录:《【web开发基础】php开发基础快速入门(1)-PHP介绍及开发环境快速安装和基本使用介绍》《【web开发基础】php开发基础快速入门(2)-......
  • 指针常量和常量指针_C++_Learning1
    怎么读?遇到"*"读指针,遇到"const"读常量 一、指针常量//指针常量——指针(也就是它存储的地址)是一个常量,所以其值不能修改,但指向的内容可以修改 inta=10,b=......
  • C++图书订单管理系统[2023-03-22]
    C++图书订单管理系统[2023-03-22]采用面向对象程序设计方法设计并实现图书订单管理系统订单基本信息:顾客帐号、顾客姓名、订书日期、图书书号、书名、购买数量订单基本......
  • 3.22 c++提高 4day
    1.对象模型成员函数不占用对象的内存-那么他们如何找到对象的成员呢因为虽然不是默认传参但是编译器会传入this指针来指向成员21: a.test();007E40B7lea......
  • 你能说出 方法重载和方法重写 的原理吗?
    JVM执行字节码指令是基于栈的架构,就是说所有的操作数都必须先入栈,然后再根据需要出栈进行操作计算,再把结果进行入栈,这个流程和基于寄存器的架构是有本质区别的,而基于寄存器......
  • Java运算符
    Java运算符Java运算符有:算术运算符、关系运算符、位运算符、逻辑运算符、赋值运算符、其他运算符算术运算符A=10,B=20操作符描述例子+加法,运算符两侧的值相加......
  • C++ 程序设计 第6章 多态与虚函数
    第6章多态与虚函数1多态的基本概念运用封装继承多态能够有效提高程序的可读性,可扩充性,可重用性。多态从字面上理解就是多种形态或多种形式。具体到C++这种面向对象程序......
  • 第4章 C++语言高级专题二
    单继承​ 继承性是面向对象程序设计中最重要的机制。这种机制提供了无限重复利用程序资源的一种途径。通过C++语言中的集成机制,可以扩展和完善旧的程序设计与适应新的需求......
  • 【C++】简答题
    1:指针(*)、引用(&)、解引用(*)、取地址(&)的概念和区别概念:指针指向一块内存,指针保存的内存的地址;引用是变量的别名,本质是引用该变量的地址。解引用是取指针指向的地址......