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)

    相关推荐

    • 使用代理ip效率高(怎么样可以提高代理ip的速度)

      技术使用代理IP速度缓慢的原因有哪些小编给大家分享一下使用代理IP速度缓慢的原因有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用代理I

      攻略 2021年12月14日
    • Flex for eclipse插件如何安装

      技术Flex for eclipse插件如何安装这篇文章主要介绍Flex for eclipse插件如何安装,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Flex for eclipse插件的安装

      攻略 2021年11月26日
    • 风衣怎么搭配好看,风衣里面怎么搭配比较好看

      技术风衣怎么搭配好看,风衣里面怎么搭配比较好看风衣外套是春秋季节必备的时尚单品,但是风衣虽经典,但不是什么人都能HOLD住的,风衣搭配不到位,根本无美感可言,很多人不清楚风衣里面穿什么好看,下面就一起看看风衣里面的搭配技

      生活 2021年10月30日
    • vue是什么手机软件

      技术vue是什么手机软件这篇文章主要讲解了“vue是什么手机软件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue是什么手机软件”吧! vu

      攻略 2021年10月26日
    • 幂的乘方50道计算题,初一解方程计算题有过程答案

      技术幂的乘方50道计算题,初一解方程计算题有过程答案1。某中学修整草场,如果让初一学生单独工作,需要7。5小时完成;如果让初二学生单独做,需要5小时完成。如果让初一幂的乘方50道计算题、初二学生一起工作1小时,再由初二学

      生活 2021年10月22日
    • 前端三大框架

      技术前端三大框架 前端三大框架前台的三个框架是指:1.Angular,是一款前端JavaScriptMVC框架来构建用户界面;2.React,JavaScript框架用于构建用户界面;3.Vue,是一套

      礼包 2021年10月28日