本文主要介绍如何在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