過載的操作符在類體中被宣告,宣告方式如同普通成員函式一樣,只不過他的名字包含關鍵字operator,以及緊跟其後的乙個c++預定義的操作符。
可以用如下的方式來宣告乙個預定義的==操作符:
class person
inline bool operator ==(const person &ps) const;
};實現方式如下:
inline bool person::operator==(const person &ps) const
呼叫方式如下:
#include
using namespace std;
int main()
這裡,因為operator ==是class person的乙個成員函式,所以物件p1,p2都可以呼叫該函式,上面的if語句中,相當於p1呼叫函式==,把p2作為該函式的乙個引數傳遞給該函式,從而實現了兩個物件的比較。
考慮如下的if語句:
if(10==p1) cout<
答案是不會的,因為只有左運算元是該類型別的物件的時,才會考慮作為類成員過載操作符。因為10不是person型別的物件,所以,不能呼叫classperson的操作符==。
考慮如下if語句:
if(person(10)==person(11))
cout<
拷貝建構函式和賦值運算子
本節內容較深,初學者請跳過。「拷貝建構函式」和「賦值運算子」都是將物件的值複製乙份然後傳給另一物件。這二個功能也是類本身就具有的,但有很多場合原封不動地複製給另外乙個物件時反而會出錯,例如在成員函式中有動態分配記憶體,或者引數指標指向外部某一位址時,就有可能出錯。
要避免這些錯誤,我們可以過載「=」運算子以及拷貝建構函式,將出錯的因素排除。下例中為了演示,故意將賦值運算子過載函式中不複製「姓名」,而拷貝建構函式中固定「年齡」。
當需要將當前類的例項直接賦值給其它型別的變數時自動轉換型別,這其實還是運算子過載。當需要其它型別直接賦值給當前類的例項時,只要增加建構函式就行。#include
#include
using namespace
std;class
stuffstring getname()
int
getage()stuff&
operator
=(stuff& x); //賦值運算子過載stuff(stuff& x):name(x.name),age(20) //拷貝建構函式過載
};stuff& stuff::
operator
=(stuff& x)
int
main ( )
#include
#include
using namespace
std;class
stuffstring getname()
int
getage()operator
int
()operator
string()};
int
main ( )
operator 過載函式
今天在看書時發現了乙個有意思的地方 class textblock char operator size t position private string text int main 對於 類的運算子過載函式 char operator size t position 其返回值是類成員text的引...
正確的過載operator
下面的段落中,我將介紹為使用者定義型別選擇正確的過載operator 的一般性的策略。第一步 選擇成員函式或是非成員函式?我們可以象使用類的成員函式一樣使用 或是 等二進位制操作符,例如 class string 然而,這種實現方式值得懷疑。在這種情況下,作為內建操作符的副本,過載後的操作符違背了內...
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 比較物件...