在c++中,除了四種操作符外(「::」,」 .*」,」.」,」 ?:」),其它內建的操作符大部分都可以是過載,但不能創造其它新的執行符如 「**」。
在類型別中,操作符過載即可以是類成員操作符也可是非類成員操作符,如果乙個操作符不屬於該類成員,那一般是以友元的形式出現。
操作符過載的一般格式如下:
[返回型別] operator《操作符》([形參列表])
;在c++的iostram庫中定義了istream與ostream兩種型別的輸入輸出流,並分別定義了兩個物件:cin與cout。在標準庫中很多類都過載了「<<」與「>>」作為非成員操作符,如string 類等。
一般將操作符「<<」與「>>」過載為非成員操作符,其過載的第乙個引數為ostream或istream的物件,第二個引數為自定義類型別物件。
在示例程式中string類中「<<」與「>>」操作符過載實現如下:
ostream & operator << (ostream &os, const string &s)
istream & operator >> (istream &is, const string &s)
函式的返回值都是ostream與instream的引用,這樣做的好處就是可以實現鏈式的輸入輸出操作。
算術操作符一般應該定義為非成員函式,因為這樣才符合我們日常算術運算規律:如sum = a+b, 運算元有兩個,相加後兩個運算元的值不變,只是把相加結果賦值給了sum。示例程式string中的」+」操作符實現下如:
string operator+(const string &lhs, const string &rhs)
函式實現上直接呼叫了string類的復合賦值操作符,返回乙個右值。
在實際應用當中,一般應該過載那些簡單明瞭實用的操作符,「+」操作符在字串類中就非常實用,但「-」,「*」等其它算術操作符就不明所以了。所以在過載算術操作符時應該特別注意操作符的實際意義,如意義明確,則不應該提供過載介面。
在c++的比較兩個物件相等通常具有意義的。相等即現在物件的資料成員是一樣的。同時如果為類定義了相等操作符,還應該相應的給出不等操作符(在實現中直接呼叫相等操作符),並且還應該考慮是是否給出相應的關係操作符。
示例當中相待操作與不等操作如下:
bool operator == (const string &lhs, const string &rhs)
else return false;
}bool operator != (const string &lhs, const string &rhs)
else
}
賦值操作與複製建構函式有點類似,如果類沒有實現,編譯器為會它自動合成。自動合成的賦值或者構造都是簡單進行資料成員拷貝,同樣都會造成指標懸空的問題,這一點在上節深度複製中已經深入分析了,在這不作細說。所以為類實現賦值操作是乙個好的程式設計習慣。賦值與複製構造的區別是,複製構造是通過乙個現有的物件去構造乙個新的空的物件,而賦值是把乙個現有物件去覆蓋乙個舊的物件(可能是乙個空的,沒有初始化的物件),在賦值當中同樣應該注意把指標所指向的記憶體空間進行相應的拷貝,在這之前還應該把原物件指標成員所指向的記憶體空間進行釋放。在string類當中,賦值操作實現如下:
string & string::operator=(const string &s)
m_pdata = null;
m_pdata = new char[strlen(s.m_pdata)+1];
memset(m_pdata,0,strlen(s.m_pdata)+1);
memcpy(m_pdata, s.m_pdata,strlen(s.m_pdata));
} return *this;
}
下標操作是為實現類似於陣列元素的讀取,即通過「「直接進行元素索引。下標操作結果應該即可讀亦可寫,所以需要同時定義兩個版本,乙個const型,用於取元素值,作為右值,不可寫;乙個非const型,作為左值,可讀可寫。 string中的下標操作符實現如下:
char & string::operator(const unsigned int index)
}const char & string::operator(const unsigned int index)const
}
復合賦值操作符,自增與自減操作符一般應該定義為成員函式,如果需要賦值操作符,則應該考慮給相應的復合賦值操作符(+=),通過呼叫復合賦值操作符可是很方便實現算術操作符(+)。在string類中,復合賦值操作實現如下:
string & string::operator +=(const string &s)
} return *this;
}
操作符過載與函式過載一樣:形參不一樣。即在內建操作符當中引數是內建資料物件 (如int), 而在我們自定義類中,形參是自定義類物件(string, string)。下面對操作過載作簡單總結下。
1、過載操作符中乙個運算元必須是類型別,如果不是,則就不是過載,而重新定義了內建操作符的含義。
2、必須與內建操作符的優先順序保持一致。
3、類成員操作符與非類成員操作符的主要區別在於引數個數差別,成員操作符比非成員操作符少乙個。
4、非成員操作符,應該定義為友元。
參考文獻《c++ primer》
C 類操作符過載筆記
不能改變操作符優先順序 不能改變操作符的結合性 不能改變操作符所需要的運算元 不能建立新的操作符 對於二元操作符過載,如果操作符左邊是類 那麼就在該類內部成員函式過載操作符即可 如果操作符左邊不是類,而是乙個常量,那麼就必須在類的外部定義乙個操作符過載函式 有乙個最基本條件 一定有乙個一元是乙個自定...
c 操作符過載 學習筆記
1.過載的限制 1 過載後的操作符必須至少有乙個運算元是使用者自定義的型別,這可以防止使用者把標準操作符給過載。比如 t operator double a,double b error 2 不能違反原來操作符的句法規則。3 不能定義新的操作符,否則那就不叫過載了。4 不能過載下面的操作符 size...
c 學習筆記 9 操作符過載
1.c 標準庫 a.c 標準庫並不是c 語言的一部分,c 標準庫是由c 語言編寫而成的類庫和函式的集合。c 標準庫中定義的類和物件都位於std命名空間中,c 標準庫的標頭檔案都不帶.h字尾,並且c 標準庫涵蓋了c庫的功能,如c庫中對應c 庫中的b.c 標準庫預定義了多數常用的資料結構,如 c.c 標...