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)

    相关推荐

    • Java Class的文件结构是怎么样的

      技术Java Class的文件结构是怎么样的本篇文章为大家展示了Java Class的文件结构是怎么样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。今天把之前在Evernote

      攻略 2021年11月16日
    • sqlserver sa登录失败(用户sa登录失败原因未与sql.server)

      技术SQL2008无法连接到.\SQLEXPRESS以及用户sa登录失败的示例分析本篇文章为大家展示了SQL2008无法连接到.\SQLEXPRESS以及用户sa登录失败的示例分析,内容简明扼要并且容易理解,绝对能使你眼

      攻略 2021年12月14日
    • openwrt内网穿透作用(openwrt内网穿透多端口)

      技术OpenWRT如何穿透内网这篇文章将为大家详细讲解有关OpenWRT如何穿透内网,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  UMU 把路由器放在公司,然后在家里想登陆它,这时

      攻略 2021年12月18日
    • 华为手机如何强制恢复出厂设置,华为低配手机怎样强制恢复出厂

      技术华为手机如何强制恢复出厂设置,华为低配手机怎样强制恢复出厂在手机上找到设置图标,进入设置界面华为手机如何强制恢复出厂设置;在设置界面下拉,找到备份和重置选项,点击进入;选择恢复出厂设置选项,单击开始恢复。
      如手机无法

      生活 2021年10月29日
    • 抖音如何吸粉,抖音如何快速吸粉?

      技术抖音如何吸粉,抖音如何快速吸粉?抖音可以说是目前来讲很好的一个风口,因此也有很多人开始进去抖音的行业,那么吸粉大家公认的抖音瓶颈,没关系,因为本文将要教你史上最简单的抖音吸粉方法。一、蹭热度
      假如你的账号根本就没有一

      测评 2021年10月26日
    • CTF入门学习3-Web通信基础

      技术CTF入门学习3-Web通信基础 CTF入门学习3-Web通信基础本篇文章主要介绍WEB通信的机制,主要介绍了URL协议和HTTP协议。Web安全基础
      01 Web通信
      这个部分重点介绍浏览器与We

      礼包 2021年11月20日