14.7. 自增操作符和自减操作符

#include<iostream>
#include<string>
using namespace std;

/*
14.7. 自增操作符和自减操作符
*/

//可以定义一个类,该类指向一个数组并为该数组中的元素提供访问检查
/*
构造函数的参数是两个指针:一个指向数组的开始,另一个指向数组的末端。
构造函数用这两个指针初始化 beg 和 end,并将 curr 初始化为指向第一个元
素。
*/
class checkedptr
{
public:
	checkedptr(int* a,int* b):beg(a),end(b),curr(a){}

	//前缀的自增自减
	checkedptr& operator++();
	checkedptr& operator--();

	//后缀的自增自减
	checkedptr operator++(int);
	checkedptr operator--(int);

private:
	int* beg;
	int* end;
	int* curr;
};

/*
为了与内置类型一致,前缀式操作符应返回被增量或减
量对象的引用。
这个自增操作符根据 end 检查 curr,从而确保用户不能将 curr 增量到超
过数组的末端。如果 curr 增量到超过 end,就抛出一个 out_of_range 异常;
否则,将 curr 加 1 并返回对象引用:
*/
checkedptr& checkedptr::operator++()
{
	if(curr==end)
		throw out_of_range("beyond the end");
	++curr;
	return *this;
}
checkedptr& checkedptr::operator--()
{
	if(curr==beg)
		throw out_of_range("below the beg");
	--curr;
	return *this;
}

/*
为了解决这一问题,后缀式操作符函数接受一个额外的(即,无用的)int 型
形参。使用后缀式操作符进,编译器提供 0 作为这个形参的实参。尽管我们的
前缀式操作符函数可以使用这个额外的形参,但通常不应该这样做。那个形参不
是后缀式操作符的正常工作所需要的,它的唯一目的是使后缀函数与前缀函数区
别开来。
为了与内置操作符一致,后缀式操作符应返回旧值(即,
尚未自增或自减的值),并且,应作为值返回,而不是
返回引用。
*/
checkedptr checkedptr::operator++(int)
{
	checkedptr ret(*this);
	++*this;
	return ret;
}

checkedptr checkedptr::operator--(int)
{
	checkedptr ret(*this);
	--*this;
	return ret;
}

int main()
{

	system("pause");
	return 1;

}
时间: 2024-08-13 17:26:52

14.7. 自增操作符和自减操作符的相关文章

C++ 的自增操作符和自减操作符

在C++ 中自增和自减操作符为对象加1或者减1提供了很多的方便,但是他们有前置和后置两种形式,以及与其它操作混合使用容易出现错误,所以在次写下自己的理解. 前置自增操作符,该操作使其操作数加1,操作的返回结果是修改后的数, 前置自减操作符,该操作使其操作数减1,操作的返回结果是修改后的数, int i = 0,j = 0; j = ++i; cout<<"i="<<i<<endl;//1 cout<<"j="<&

Java自增和自减操作符——++/--的那些事

1. 概述 自增操作符(++)和自减操作符(--)是对变量进行加1和减1的操作. 2.分类说明 ++和--是对变量进行自增1和自减1的简写操作符.许多编程任务中经常需要对变量加1或者减1,所以采用这两个操作符会方便许多.例如,下面的代码是对i自增1,而对j自减1: int i = 3, j = 3; i++; // i become 4 j--; // j become 2 i++读为i加加,i--读为i减减.这些操作符分别称为后置自增操作符和后置自减操作符,因为操作符++和--放在变量后面.这

C++ Primer 学习笔记_61_重载操作符与转换 --自增/自减操作符

重载操作符与转换 --自增/自减操作符 引言: 自增,自减操作符常常由诸如迭代器这种类实现,这种类提供相似于指针的行为来訪问序列中的元素.比如,能够定义一个类,该类指向一个数组并为该数组中的元素提供訪问检查: class CheckedPtr { public: //这个类没有默认构造函数,必须提供指向数组的指针. /**构造函数的參数是两个指针:一个指向数组的開始,还有一个指向数组的末端. *构造函数用这两个指针初始化 beg 和 end *并将 curr 初始化为指向第一个元素 */ Che

恶补C++ 之 自增、自减操作符前缀式与后缀式的区别

相信很多人刚开始学习编程的时候,也是为这个问题烦恼过吧,前缀式与后缀式,在很久之前,式没有办法区别++和--操作符的前缀和后缀的调用的.不过在C++已经得到了扩展. 然而无论式前缀或者后缀,都只有一个参数.为了解决这个问题,C++规定后缀形式有一个int类型的参数,当函数被调用的时候,编译器传递一个0作为int参数给该函数: class UPInt { public: UPInt& operator++();        // ++前缀 const UPInt operator++(int);

编程题:自增运算与自减运算的运用

#include<stdio.h> void main() {int a1,a2,a3,a4,b1,b2,b3,b4; a1=a2=a3=a4=10; b1=(a1++)+(a1++)+(a1++); b2=(++a2)+(++a2)+(++a2); b3=(a3--)+(a3--)+(a3--); b4=(--a4)+(--a4)+(--a4); printf("a1=%d,a2=%d,b1=%d,b2=%d\n",a1,a2,b1,b2); printf("a

C++ Primer 学习笔记_62_重载操作符与转换 --调用操作符和函数对象

重载操作符与转换 --调用操作符和函数对象 引言: 能够为类类型的对象重载函数调用操作符:一般为表示操作的类重载调用操作符! struct absInt { int operator() (int val) { return val > 0 ? val : -val; } }; 通过为类类型的对象提供一个实參表而使用调用操作符,所用的方式看起来系那个一个函数调用: absInt absObj; int i = -1; cout << absObj(i) << endl; 虽然

C++ Primer 学习笔记_58_重载操作符与转换 --重载操作符的定义

重载操作符与转换 --重载操作符的定义 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 重载操作符的定义 重载操作符是具有特殊名称的函数:保留字operator后接定义的操作符符号.如: Sales_item operator+(const Sales_item &,const Sales_item &); 除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数数目相同.函数调用操作符可以接受任意数目的操作数. 1.重载的操作符名

C++中前置操作符和后置操作符的重载

1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++  // i 的值作为返回值,i 自增 1: 2,++i  // i 自增 1,i 的值作为返回值: 3,没有使用返回值,由于编译器(不同的编译器都是一样的)的优化,在工程上面,这两行代码没有区别: 2,真的有区别吗?编程实验: 1,main.cpp 文件: 1 #include <iostream> 2 #include <stri

第四十课、前置操作符和后置操作符

一.i++和++i有没有区别? 1.现代编译器产品会对代码进行优化 2.优化使得最终二进制程序更加高效 3.优化后的二进制程序丢失了c/c++的原生语义 4.不可能从编译后的二进制程序还原c/c++程序 //由此可知,单行的i++和++i在汇编层的代码完全一样 int i = 0; 0123136E mov dword ptr [i],0 i++; 01231375 mov eax,dword ptr [i] 01231378 add eax,1 0123137B mov dword ptr [