C++运算符重载函数基本及其值返回状态
当前位置:以往代写 > C/C++ 教程 >C++运算符重载函数基本及其值返回状态
2019-06-13

C++运算符重载函数基本及其值返回状态

C++运算符重载函数基本及其值返回状态

副标题#e#

运算符重载是C++的重要构成部门,它可以让措施越发的简朴易懂,简朴的运算符利用可以使巨大函数的领略更直观。

对付普通工具来说我们很自然的会频繁利用算数运算符让他们参加计较,可是对付自界说类的工具来说,我们是无论如何也不能阻止写出像下面的代码一样的措施来的。

例子如下:

class Test
{
//进程省略
}
int main()
{
Test a,c;
c=a+a;
}

虽然这样的代码是不可以或许通过编译的,c++对自定类的算术运算部门保存给了措施员,这也是切合c++机动特性的。

在c++中要想实现这样的运算就必需自界说运算符重载函数,让它来完整详细事情。

在这里要提醒读者的是,自界说类的运算符重载函数也是函数,你重载的一切运算符不会因为是你本身界说的就改变其运算的优先级,自界说运算符的运算优先级同样遵循与内部运算符一样的顺序。

C++运算符重载函数根基及其值返回状态

除此之外,c++也划定了一些运算符不可以或许自界说重载,譬喻.、::、.*、.->、?:。

下面我们来进修如何重载运算符,运算符重载函数的形式是:

返回范例 operator 运算符标记 (参数说明)

{
//函数体的内部实现
}

运算符重载函数的利用主要分为两种形式,一种是作为类的友元函数举办利用,另一种则是作为类的成员函数举办利用。

下面我们先看一下作为类的友元函数利用的例子:

//措施作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include <iostream>
using namespace std;

class Test
{
public:
Test(int a = 0)
{
Test::a = a;
}
friend Test operator +(Test&,Test&);
friend Test& operator ++(Test&);
public:
int a;
};
Test operator +(Test& temp1,Test& temp2)//+运算符重载函数
{
//cout<<temp1.a<<"|"<<temp2.a<<endl;//在这里可以调查通报过来的引用工具的成员分量
Test result(temp1.a+temp2.a);
return result;
}
Test& operator ++(Test& temp)//++运算符重载函数
{
temp.a++;
return temp;
}
int main()
{
Test a(100);
Test c=a+a;
cout<<c.a<<endl;
c++;
cout<<c.a<<endl;
system("pause");
}

在例子中,我们对付自界说类Test来说,重载了加运算符与自动递增运算符,重载的运算符完成了同范例工具的加运算和递增运算进程。


#p#副标题#e#

重载运算符函数返回范例和形式参数也是按照需要量举办调解的,下面我们来看一下修改后的加运算符重载函数。

代码如下:

//措施作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include <iostream>
using namespace std;

class Test
{
public:
Test(int a = 0)
{
Test::a = a;
}
friend Test operator +(Test&,const int&);
public:
int a;
};
Test operator +(Test& temp1,const int& temp2)//+运算符重载函数
{
Test result(temp1.a * temp2);
return result;
}
int main()
{
Test a(100);
Test c = a + 10;
cout<<c.a<<endl;
system("pause");
}

上面修改后的例子中,我们让重载后的加运算符做的工作,事实上并不是同范例工具的加运算,而是自界说类工具与内置int常量工具的乘法运算。

值得留意的是,对付运算符重载来说,我们并不必然要用它必然要做同范例工具的加法可能是其它运算,运算符重载函数自己就是函数,那么在函数体内部我们是可以做任何工作的,可是从不违背通例思维的角度来说,我们没有须要让重载加运算的函数来做与其重载的标记意义上完全不相符的事情,所以在利用重载运算符离开原意之前,必需担保有足够的来由。

下面我们接头一下作为类成员函数的运算符重载函数的利用,及其函数的值返回与引用返回的不同。

#p#副标题#e#

下面我们先看实例,尔后慢慢阐明。

代码如下(重要部门做了具体的注解):

//措施作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
using namespace std;
class Test
{
public:
Test(int a = 0)
{
Test::a = a;
}
Test(Test &temp)
//运算符重载函数为值返回的时候会发生姑且变量,姑且变量与局部变量result的复制会挪用拷贝结构函数,姑且变量的生命周期是在拷贝结构函数运行完成后才竣事,但假如运算符重载函数返回的是引用,那么不会发生姑且变量,而局部变量result的生命周期在运算符重载函数退出后当即消失,它的生命周期要比姑且变量短,所以当外部工具获取返回值的内存地点所存储的值的时候,得到是一个已经失去结果的内存地点中的值,在这里的值返回与引用返回的比拟,证明白姑且变量的生命周期比局部变量的生命周期稍长。
{
cout<<"载入拷贝结构函数"<<"|"<<temp.a<<endl;//留意这里,假如修改运算符重载函数为返回引用,这里就会呈现异常,temp.a将得到一个随机值。
Test::a = temp.a;
}
~Test()//在mian()内析构的进程是result局部变量发生的
{
cout<<"载入析构函数!"<<endl;
cin.get();
}
Test operator +(Test& temp2)//+运算符重载函数
{
//cout<<this->a<<endl;
Test result(this->a+temp2.a);
return result;
}
Test& operator ++()//++运算符重载函数
//递增运算符是单目运算符,利用返回引用的运算符重载函数原理就在于它需要改变自身。
//在前面我们进修引用的单位中我们知道,返回引用的函数是可以作为左值参加运算的,这一点也切合单目运算符的特点。
//假如把该函数改成返回值,而不是返回引用的话就粉碎了单目预算改变自身的特点,措施中的++(++c)运算竣事后输出c.a,会发明工具c只做了一次递增运算,原因在于,当函数是值返回状态的时候括号内的++c返回的不是c自己而是姑且变量,用姑且变量参加括号外的++运算,虽然c的值也就只改变了一次。
{
this->a++;
return *this;
}
public:
int a;
};
int main()
{
Test a(100);
Test c=a+a;
cout<<c.a<<endl;
c++;
cout<<c.a<<endl;
++c;
cout<<c.a<<endl;
++(++c);
cout<<c.a<<endl;
system("pause");
}

上例中运算符重载函数以类的成员函数方法呈现,细心的读者会发明加运算和递增运算重载函数少了一个参数,这是为什么呢?

因为当运算符重载函数以类成员函数身份呈现的时候,C++会埋没第一个参数,转而代替的是一个this指针。

#p#副标题#e#

接下来我们详细阐明一下运算符重载函数的值返回与引用返回的不同。

#p#分页标题#e#

当我们把代码中的加运算重载函数修改成返回引用的时候:

Test& operator +(Test& temp2)//+运算符重载函数
{
Test result(this->a+temp2.a);
return result;
}

执行运算符重载函数返回引用将不发生姑且变量,外部的Test c=a+a; 将得到一个局部的,栈空间内存地点位置上的值,而栈空间的特性汇报我们,当函数退出的时候函数体中局部工具的生命周期随之竣事,所以生存在该地点中的数据也将消失,当c工具去获取存储在这个地点中的值的时候,内里的数据已经不存在,导致c得到的是一个随机值,所以作为双目运算的加运算符重载函数是不益回收返回引用方法编写的,虽然假如必然要返回引用,我们可以在堆内存中动态开发空间存储数据,可是这么做会导致特另外系统开销,同时也会让措施更难读懂。

对付递增运算符来说,它的意义在于可以或许改变自身,返回引用的函数是可以作为左值参加运算的,所以作为单目运算符,重载它的函数回收返回引用的方法编写是最符合的。

假如我们修改递增运算符重载函数为值返回状态的时候,又会呈现什么奇怪的现象呢?

代码如下:

Test operator ++()
{
return this->a++;
}

外貌上是发明不出什么出格明明的问题的,可是在main()函数中++(++c);的执行功效却出乎料想,理论上应该是204的值,却只是203,这是为什么呢?

因为当函数是值返回状态的时候括号内的++c返回的不是c自己而是姑且变量,用姑且变量参加括号外的++运算,虽然c的值也就只改变了一次。功效为203而不是204。

对付运算符重载函数来说,最后我们还要留意一个问题,当运算符重载函数的形式参数范例全部为内部范例的时候,将不能重载。

    关键字:

在线提交作业