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
不相等
沒有問題
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2135175/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++ 操作符過載C++
- C++ operator關鍵字(過載操作符)C++
- 操作符過載集錦
- PHP 中的操作符過載PHP
- C++之【操作符】彙總 &【不能被過載的運算子】小記C++
- Kotlin——初級篇(五):操作符與操作符過載一Kotlin
- c#一元操作符過載C#
- C++ 過載運算子和過載函式C++函式
- C++運算子過載C++
- C++函式過載C++函式
- C++ 運算子過載C++
- C++——運算子過載C++
- [C++]運算子過載C++
- C++ lambda的過載C++
- C++過載的奧義之運算子過載C++
- dart基礎之類介面操作符過載相關Dart
- RxJava操作符之過濾操作符(五)RxJava
- C++之函式過載C++函式
- C++過載底層原理C++
- C++的函式過載C++函式
- C++四種cast操作符C++AST
- JsonPath 驗證類既 Groovy 過載操作符實踐JSON
- C++ 函式過載和模板C++函式
- C++運算子過載詳解C++
- C++中運算子的過載C++
- C++的函式的過載C++函式
- 開心檔之C++ 過載運算子和過載函式C++函式
- C++中條件操作符巢狀C++巢狀
- C++操作符的優先順序C++
- 解剖 RxJava 之過濾操作符RxJava
- C++之過載覆蓋和隱藏C++
- C++入門教程(14):過載函式C++函式
- C++中過載new和delete的使用C++delete
- C++整理3_過載及其相關C++
- C/C++—— C++中函式重寫和函式過載C++函式
- 初步C++運算子過載學習筆記<3> 增量遞減運算子過載C++筆記
- C++運算子過載的一些困惑C++
- 118 C++中函式的過載C++函式