C++如何实现操作符重载

技术C++如何实现操作符重载这篇文章主要介绍了C++如何实现操作符重载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在C++

本文主要介绍如何在C语言中实现运算符重载,具有一定的参考价值。有兴趣的朋友可以参考一下。希望大家看完这篇文章后收获多多。让边肖带你去了解它。

c语言中经常遇到重载运算符,其实重载运算符必须被视为运算符。

一个函数,为了区分其参数的返回值,必须找出内存在哪里,如何分配,如何回收。

何时生成匿名对象以及何时使用该指针返回它。

操作符可以使用用友和成员函数来完成。一般来说,使用成员函数,但是有些

friend函数必须在特殊情况下使用,例如,因为它的左操作数是ostream类型,对吗?

可能会有所改变。

重载成员函数运算符的一般步骤如下:

比如Tclass a

t类b

我们需要重载=符号。

a=b

1.将要重载的运算符视为生成运算符函数名的函数。

如过载等待=

即,运算符=

2.区分形式参数

如果是等号重载,很明显如果是成员函数参数,就是右操作数,B原型是和。

t类b

这时,第一个操作数是隐藏的,也就是*this。

3.区分返回值

为了实现级联编程如a=b=c,因为=从右到左的连通性

然后

A=(b=c)表示a.operator=(b.operator=(c))

那么b=c需要返回一个Tclass类型。当然,最好是B直接返回

这是内存空间。

然后,我们可以编写函数的原型,并将其返回如下:

t类运算符=(t类b)

{

..

返回*这个;

}

实现具体分析。

以下是关于char*类型类的运算符重载,包括

1,=运算符重载(深度复制)

2.操作员超载

3.预加载和后加载

4、===过载

5.重负载

因为涉及char*类型的类容易导致内存泄漏,下面是测试程序的内存泄漏检查。

==5613==堆摘要:

==5613==在exit: 0字节0块中使用

==5613==总堆usage: 9个allocs,9个frees,分配了102个字节

==5613==

==5613==所有堆块都已释放-不可能有泄漏

==5613==

==5613==错误摘要: 0个来自0个上下文的错误(从0中抑制:个0)

==5613==错误摘要: 0个来自0个上下文的错误(从0中抑制:个0)

具体代码如下:

单击此处折叠或打开。

/*************************************************************************

文件名: class.cpp

作者:高鹏版权所有

邮件: gaopp_200217@163.com

创建时间2017年3月25日星期六04:40:31下午中央标准时间

************************************************************************/

#包括牡蛎

# includestdlib.h

#includestring.h

我们

ing namespace std;

  • class testop

  • {

  •         private:

  •                 char* mystr;

  •                 int len;

  •         public:

  •                 testop(const char* instr)

  •                 {

  •                         this->len = strlen(instr)+1;

  •                         this->mystr = new char[this->len];

  •                         memset(this->mystr,0,this->len);

  •                         strcpy(this->mystr,instr);

  •                 }

  •                 testop()

  •                 {

  •                         this->len = 0;

  •                         this->mystr = NULL;

  •                 }

  •                 testop(const testop& b)//copy 构造函数深拷贝

  •                 {

  •                         this->len = b.len;

  •                         this->mystr = new char[b.len];

  •                         memset(this->mystr,0,this->len);

  •                         strcpy(this->mystr,b.mystr);

  •                 }

  •                 void printmystr()

  •                 {

  •                         cout<<this->mystr<<endl;

  •                 }

  •                 ~testop()

  •                 {

  •                         delete [] this->mystr;

  •                 }

  •                 //操作符重载 + 使用成员函数

  •                 testop operator+(const testop& b)

  •                 {

  •                         testop temp;

  •                         temp.len = this->len + b.len;

  •                         temp.mystr = new char[temp.len];

  •                         memset(temp.mystr,0,temp.len);

  •                         strcat(strcat(temp.mystr,this->mystr),b.mystr);

  •                         return temp;

  •                 }

  •                 //操作符重载 = 使用成员函数 深拷贝

  •                 testop& operator=(const testop& b)

  •                 {

  •                         if(this->mystr != NULL)//必须先释放内存

  •                         {

  •                                 delete [] this->mystr;

  •                         }

  •                         this->len = b.len;

  •                         this->mystr = new char[this->len];

  •                         memset(this->mystr,0,this->len);

  •                         strcpy(this->mystr,b.mystr);

  •                         return *this;

  •                 }

  •                 //操作符重载前置(++),使用成员函数 支持链试编程

  •                 testop& operator++()

  •                 {

  •                          this->len = this->len+this->len;

  •                          char* temp = new char[this->len];

  •                          memset(temp,0,this->len);

  •                          strcat(strcat(temp,this->mystr),this->mystr);

  •                          delete [] this->mystr;

  •                          this->mystr = new char[this->len];

  •                          strcpy(this->mystr,temp);

  •                          delete [] temp;

  •                          return *this;

  •                 }

  •                 //操作符重载后置(++),使用成员函数 不支持链试编程 因为返回的为一个匿名对象

  •                 testop operator++(int)

  •                 {

  •                     testop tempop = *this;

  •                         this->len = this->len+this->len;

  •                         char* temp = new char[this->len];

  •                         memset(temp,0,this->len);

  •                         strcat(strcat(temp,this->mystr),this->mystr);

  •                         delete [] this->mystr;

  •                         this->mystr = new char[this->len];

  •                         strcpy(this->mystr,temp);

  •                         delete [] temp;

  •                         return tempop;

  •                 }

  •                 //操作符重载 << 必须使用友元函数 支持链试编程

  •                 friend ostream& operator<<(ostream& out,testop& b);

  •                 //操作符重载 == 使用成员函数

  •                 bool operator==(testop& b)

  •                 {

  •                         if(this->len == b.len && !strcmp(this->mystr,b.mystr))

  •                         {

  •                                 return true;

  •                         }

  •                         else

  •                         {

  •                                 return false;

  •                         }

  •                 }

  •                 //操作符重载 != 使用成员函数

  •                 bool operator!=(testop& b)

  •                 {

  •                         if((*this) == b )

  •                         {

  •                                 return false;

  •                         }

  •                         else

  •                         {

  •                                 return true;

  •                         }

  •                 }

  • };

  • ostream& operator<<(ostream& out,testop& b) // 友元函数

  • {

  •         out<<b.mystr;

  •         return out;

  • }

  • int main()

  • {

  •         testop c("ab");

  •         cout<<c<<endl;

  •         c++;

  •         ++c;

  •         cout<<"c:"<<c<<endl;

  •         testop a=c;

  •         cout<<"a:"<<a<<endl;

  •         if(a == c)

  •         {

  •                 cout<<"相等"<<endl;

  •         }

  •         a = c+a;

  •         cout<<"a=c+a:"<<a<<endl;

  •         if(a !=c )

  •         {

  •                 cout<<"不相等"<<endl;

  •         }

  • }

  • 结果如下:
    gaopeng@bogon:~/cplusnew/操作符重载$ ./a.out 
    ab
    c:abababab
    a:abababab
    相等
    a=c+a:abababababababab
    不相等

    感谢你能够认真阅读完这篇文章,希望小编分享的“C++如何实现操作符重载”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

    内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/128605.html

    (0)

    相关推荐

    • 怎么构建nftables

      技术怎么构建nftables这篇文章将为大家详细讲解有关怎么构建nftables,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。当前,有一个与 nftables 兼容的 iptables

      攻略 2021年10月26日
    • jquery如何检查一个表格有多少行

      技术jquery如何检查一个表格有多少行这篇文章主要为大家展示了“jquery如何检查一个表格有多少行”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jquery如何检查一个表

      攻略 2021年11月21日
    • React5种非常流行的状态管理库是什么

      技术React5种非常流行的状态管理库是什么本篇内容主要讲解“React 5种非常流行的状态管理库是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React 5种非常流行

      攻略 2021年10月26日
    • 如何实现对Samba UAF和内存泄漏漏洞的分析

      技术怎么实现Samba UAF和内存泄露漏洞的分析怎么实现Samba UAF和内存泄露漏洞的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0x00 事件

      攻略 2021年12月22日
    • Ubuntu下图形界面串口工具Cutecom的安装和升级

      技术Ubuntu下图形界面串口工具Cutecom的安装和升级 Ubuntu下图形界面串口工具Cutecom的安装和升级串口的图形界面化工具在Windows下很多, 但是在Linux下可选择的就很少, C

      礼包 2021年12月2日
    • linux 搭载yum私有仓库

      技术linux 搭载yum私有仓库 linux 搭载yum私有仓库yum私有仓库本地版
      @目录yum私有仓库本地版1.下载必须的软件包2.创建软件仓库3.下载对应的软件yum私有仓库本地版插图1)4.初

      礼包 2021年12月17日