您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++如何實現操作符重載,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在C++中經常會遇到重載運算符的問題,其實運算符重載必須將運算符看做
一個函數,分清他的形參返回值,必須搞清楚內存在哪里如何分配如何回收
什么時候生成匿名對象,什么時候使用this指針返回。
運算符可以用友元函數和成員函數完成,一般來講都使用成員函數,但是某些
特殊的情況必須使用友元函數,比如<< 因為其左操作數為ostream&類型,是不
可能進行任何修改的。
成員函數運算符重載大體步驟如下:
比如Tclass a
Tclass b
我們要重載=號
a = b
1、將需要重載的運算符看做一個函數生成operator函數名
如重載等待=
即operator=
2、分清楚形參
如果是等號重載很明顯如果是成員函數形參是右操作數b原型為及
Tclass& b
這個時候第一操作數被隱藏即 *this。
3、分清返回值
為了實現如:a=b=c的級聯編程,因為=連接性右到左
則為
a=(b=c)即 a.operator=(b.operator=(c))
那么b=c需要返回一個Tclass&類型,當然最好就是 b直接返回
也就是*this內存空間。
那么分析到這里我們可以寫出函數原型和返回如下:
Tclass& operator=( Tclass& b)
{
...........
return *this;
}
具體實現具體分析。
下面是一個關于char*類型類的運算符重載,包括了
1、=操作符重載(深拷貝)
2、+操作符重載
3、前置++ 后置++重載
4、!= ==重載
5、<< 重載
因為涉及到char*類型的類容易引起內存泄露下面是測試程序內存泄露檢查
==5613== HEAP SUMMARY:
==5613== in use at exit: 0 bytes in 0 blocks
==5613== total heap usage: 9 allocs, 9 frees, 102 bytes allocated
==5613==
==5613== All heap blocks were freed -- no leaks are possible
==5613==
==5613== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==5613== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
具體代碼如下:
點擊(此處)折疊或打開
/*************************************************************************
> File Name: class.cpp
> Author: gaopeng QQ:22389860 all right reserved
> Mail: gaopp_200217@163.com
> Created Time: Sat 25 Mar 2017 04:40:31 PM CST
************************************************************************/
#include<iostream>
#include<stdlib.h>
#include<string.h>
using 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++如何實現操作符重載”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。