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)

    相关推荐

    • 怎样使用HLAscan进行HLA分型

      技术怎样使用HLAscan进行HLA分型这篇文章将为大家详细讲解有关怎样使用HLAscan进行HLA分型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。HLAScan是由韩

      攻略 2021年11月10日
    • css权重有什么用

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

      攻略 2021年12月9日
    • Java流程控制图

      技术Java流程控制图 Java流程控制图package scanner;import java.util.Scanner;public class Demo01 {// 创建一个扫描对象,用于接

      礼包 2021年11月24日
    • MYSQL有哪些运算符

      技术MYSQL有哪些运算符这篇文章主要介绍“MYSQL有哪些运算符”,在日常操作中,相信很多人在MYSQL有哪些运算符问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MYSQL有哪些运算符”

      攻略 2021年11月9日
    • python文本进度条怎么实现

      技术python文本进度条怎么实现本篇内容介绍了“python文本进度条怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有

      攻略 2021年12月9日
    • 四个象限口诀,三角函数的平方奇偶性的判断口诀

      技术四个象限口诀,三角函数的平方奇偶性的判断口诀“奇四个象限口诀、偶”指的是π/2的倍数的奇偶,“变与不变”指的是三角函数的名称的变化:“变”是指正弦变余弦,正切变余切。(反之亦然成立)“符号看象限”的含义是:把角α看做

      生活 2021年10月29日