当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++递增(增量)运算符重载的思考

C++递增(增量)运算符重载的思考

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:371

副标题#e#

在前面的章节中我们已经打仗过递增运算符的重载,当时候我们并没有区分前递增与后递增的不同,在凡是环境下我们是别离不出++a与a++的不同的,但简直他们直接是存在明明不同的。

先看如下代码:

#include <iostream>
using namespace std;

int main()
{
int a=0;
++(++a);//正确,(++a)返回的是左值
(a++)++;//错误,(a++)返回的不是左值
system("pause");
}

代码中(a++)++编译堕落误,返回“++”需要左值的错误,这正是前递增与后递增的不同导致的,那么又是为什么呢?

原因主要是由C++对递增(增量)运算符的界说激发的。

他们之间的不同主要为以下两点:

1、运算进程中,先将工具举办递增修改,尔后返回该工具(其实就是工具的引用)的叫前递增(增量)运算。在运算符重载函数中回收返回工具引用的方法编写。

2、运算进程中,先返回原有工具的值,尔后举办工具递增运算的叫后递增(增量)运算。在运算符重载函数中回收值返回的方法编写(这也正是前面(a++)++堕落误的原因,(a++)返回的不是引用,不能看成左值继承介入扩号外部的++运算),重载函数的内部实现必需建设一个用于姑且存储原有工具值的工具,函数返回的时候就是返回该姑且工具。

那么在编写运算符重载函数的时候我们该如何区分前递增运算符重载函数与后递增运算符重载函数呢?

要领就是:在后递增运算符重载函数的参数中多加如一个int标识,标志为后递增运算符重载函数。

详细见如下实例(例一为非成员方法,例二为成员方法):

//例一 

//措施作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
using namespace std;
class Test
{
public:
Test(int a=0)
{
Test::a = a;
}
friend Test& operator ++ (Test&);
friend Test operator ++ (Test&,int);
public:
int a;
};
Test& operator ++ (Test &temp)//前递增
{
temp.a++;
return temp;
}
Test operator ++ (Test &temp,int)//后递增,int在这里只起到区分浸染,事实上并没有实际浸染
{
Test rtemp(temp);//这里会挪用拷贝结构函数举办工具的复制事情
temp.a++;
return rtemp;
}
int main()
{
Test a(100);
++(++a);
cout<<a.a<<endl;
cout<<"调查后递增环境下姑且存储工具的值状态:"<<(a++).a<<endl;//这里正是浮现后递增操纵先返回原有工具值处所
cout<<a.a<<endl;
(a++)++;
cout<<a.a<<endl;//由于后递增是值返回状态,所以(a++)++只对a做了一次递增操纵,操纵后为104而非105。
system("pause");
}


#p#副标题#e#

//例二 

//措施作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
using namespace std;
class Test
{
public:
Test(int a=0)
{
Test::a = a;
}
Test& operator ++ ();
Test operator ++ (int);
public:
int a;
};
Test& Test::operator ++ ()//前递增
{
this->a++;
return *this;
}
Test Test::operator ++ (int)//后递增
{
Test rtemp(*this);//这里会挪用拷贝结构函数举办工具的复制事情
this->a++;
return rtemp;
}
int main()
{
Test a(100);
++(++a);
cout<<a.a<<endl;
cout<<"调查后递增环境下姑且存储工具的值状态:"<<(a++).a<<endl;//这里正是浮现后递增操纵先返回原有工具值处所
cout<<a.a<<endl;
(a++)++;
cout<<a.a<<endl;//由于后递增是值返回状态,所以(a++)++只对a做了一次递增操纵,操纵后为104而非105。
system("pause");
}

通过对前后递增运算的阐明,我们可以进一步可以相识到,对付沟通环境的单目运算符重载我们都必需做好这些区别事情,担保重载后的运算符切合要求。

 

    关键字:

天才代写-代写联系方式