正確的過載operator

2021-09-30 06:03:15 字數 2003 閱讀 6462

下面的段落中,我將介紹為使用者定義型別選擇正確的過載operator+的一般性的策略。

第一步:選擇成員函式或是非成員函式?

我們可以象使用類的成員函式一樣使用+、-或是==等二進位制操作符,例如:

class string

;然而,這種實現方式值得懷疑。在這種情況下,作為內建操作符的副本,過載後的操作符違背了內建操作符具有的對稱性,它的兩個操作符的型別分別是'const string* const'(隱含的this 引數)和'const string &',這將使得一些stl運算和某一些容器不能正確的處理這些物件。

另一種反其道而行之的方法是,把過載的operator+定義為外部函式,兩個引數的型別相同,如下:

string operator + (const string & s1, const string s2);

在這種情況下,類string要定義運算子的過載函式為友元函式:

class string

;第二步:返回值,進退兩難的選擇

正如前面所述,內建的operator+返回同它的操作符型別相同的右值。不過在caller的堆疊中執行物件將是低效率的,特別是在處理大物件的時候。能不能用返回乙個指標或是乙個傳引用來代替?在這裡不行。我們要求變數和返回值的型別要相同,返回指標破壞了這一特性。更糟糕的是,這使得我們不能使用多重連續表示式:

string s1,s2,s3;

string res;

res=s1+s2+s3; //返回不合法的string*

另外當返回的指標指向的是乙個動態分配的物件,如果呼叫者沒有清除這個返回的指標,就會導致記憶體洩漏。所以很明顯的,返回string*是個糟糕的想法。

那麼可不可以返回string&?同樣的,返回的引用必須繫結到乙個合法的string。

接下來,既然動態分配物件不行,那麼我們何不選擇返回乙個對區域性靜態變數的引用?是的,靜態物件可以解決記憶體洩漏的問題。不過這仍然有些不可靠。比如在乙個多執行緒程式中,兩個執行緒可能同時呼叫operator+,這就會導致對string物件的誤用。此外,因為靜態物件保留上一次呼叫時的狀態,所以我們必須在每次呼叫operator+前清空這個靜態string物件。

第三步:實現

到目前為止一切順利。在前面我們採用了外部友元函式並且採用by value返回值方式。那麼現在該是我們實現過載opertor+函式的時候了。然而又一次,我們面臨兩種選擇:

選擇一:intrusive concatenation模型

在intrusive concatenation模型中,operator+測量函式引數的長度,複製字串到乙個足夠地大的緩衝區並且返回結果:

// option 1: intrusive concatenation

string operator + (const string & s1, const string s2)

這個實現能夠較好的工作,不過還有更簡潔更靈活的基於過載的operator+=的解決方案。

選擇二:使用運算子+=

我們使用operator+=來,從而避免對private資料的訪問、記憶體分配以及c函式的使用。

// option 2: using operator +=

string operator + (const string & s1, const string s2)

這個實現方法比較容易,而且不會訪問string類的非公有資料。並且,我們甚至不需要把它宣告為友元函式。operator+=的過載實現留給讀者作為練習。

作為過載operator+運算子的最廣泛的例子,我們討論的焦點集中在了自己編寫的乙個string類。當然,你可以把我介紹的方法和策略應用到任意的user-defined型別上。正確的過載operator+基於以下原則:

運算子對稱性

●返回值與操作符型別相同

●採用by value返回方式

●採用基於過載+=運算子的實行方式

operator過載整理

過載的操作符在類體中被宣告,宣告方式如同普通成員函式一樣,只不過他的名字包含關鍵字operator,以及緊跟其後的乙個c 預定義的操作符。可以用如下的方式來宣告乙個預定義的 操作符 class person inline bool operator const person ps const 實現方...

operator 過載函式

今天在看書時發現了乙個有意思的地方 class textblock char operator size t position private string text int main 對於 類的運算子過載函式 char operator size t position 其返回值是類成員text的引...

C 過載operator的示例

include include using namespace std class test test const int a v a test const test t1 v t1.v 以下過載小於號 比較兩個物件的大小 bool operator const test t1 const 比較物件...