不能過載的操作符有::: .* . ?: 四個
過載操作符不再具備短路求值的特性,如過載&&, ||, 逗號,過載這些操作符也不是一種好的做法。
作為類成員的過載函式,包含了乙個隱含的this形參,限定為第乙個運算元,過載一元函式如果作為成員函式就沒有顯示形參,如果作為非成員函式就有乙個形參,過載二元操作符定義為成員時有乙個形參,定義為非成員時有兩個形參。一般將算數和關係操作符定義為非成員函式,將賦值操作符定義為成員函式。操作符定義為非成員函式時,通常要將它們設定成操作類的友元函式。因為通常要訪問類的私有部分。是否定義為成員函式,以下是一些指導原則:
1 賦值(=), 下標, 呼叫()和成員訪問箭頭(->)必須定義為成員,定義為非成員會在編譯時發生錯誤
2 改變物件狀態或與給定型別緊密聯絡的其他一些操作符,如自增,自減和解引用,通常定義為類成員
3 對稱的操作符,如演算法運算子,相等操作符,關係操作符和位操作符,最好定義為非成員函式。
對於輸入輸出操作符,因為第乙個引數應該是istream或ostream型別,所以必須定義為非成員函式,而通常要對私有成員進行讀寫,所以需要定義為友元,且返回乙個ostream或istream的引用。對於輸入操作符,一般需要檢查輸入流是否錯誤。如乙個類似string的輸入輸出操作符過載:
//輸入輸出操作符過載為友元函式
friend ostream& operator<<(ostream& os, const string &o)
friend istream& operator>>(istream& in, string &s)
算術和關係操作符定義為非成員函式,且算術 操作符為了保持與內建操作符一致,應該返回乙個右值,而不是乙個引用。關聯容器預計某些演算法,使用預設《操作符。
賦值操作符必須是類的成員,賦值操作符可以過載,可以為乙個類增加多個賦值操作符,操作符的引數不同。賦值操作符必須返回對*this的引用,這是與內建型別的賦值一致的,而且返回乙個引用,就不需要建立和撤銷結果的臨時副本,返回值通常是左運算元的引用。
類定義下標操作符時,一般要定義兩個版本,乙個非const成員並返回引用,乙個const成員並返回const引用,供const物件使用。
箭頭操作符(->)必須定義為類成員函式,解引用操作符(*)不要求定義為成員,但將它定義為成員一般也是正確的。這兩個過載常用在實現智慧型指標。通常也需要定義const版本和非const版本,過載的箭頭操作符必須返回指向類型別的指標。
自增自減操作符,傾向於定義為成員,字首操作符返回物件的引用,字尾加(int)返回舊值,且是值返回,不是引用返回。--操作符一般呼叫字尾操作符一般呼叫字首操作符實現,所以按說是字首操作符快一些。
呼叫操作符(),類成員,定義了呼叫操作符的類,其物件稱之為函式物件。可以定義多個版本,由形參的數目和型別加以區別。
struct absint
};
轉換操作符,是一種特殊的類成員函式,定義將類型別轉換為其他型別。格式:operator type(), type表示內建型別名、類型別名或由型別別名所定義的名字。對任何可作為函式返回型別的型別(除void)外都可以定義轉換型別。不允許轉換為陣列或函式型別,轉換為指標型別(資料和函式指標)以及引用型別是可以的。轉換函式必須是成員函式,不能指定返回型別,並且形參表必須為空。雖然不能指定返回型別,但是每個轉換函式必須顯示返回乙個指定型別的值。轉換函式一般不應該改變被轉換的物件。因此轉換操作符通常定義為const成員。例子:class smallint
//轉換操作符,轉換為int
operator int() const
};
類型別轉換之後不能再跟另乙個類型別轉換,如果需要多個類型別轉換,則**將出錯。 C 操作符過載
1.作為成員過載 class myclass public myclass operator const myclass d cons friend myclass operator const myclass a1,const myclass a2 關於返回值型別的討論 呼叫者堆疊裡返回乙個物件效...
C 過載操作符
過載操作符 一 過載操作符的定義 1.過載操作符的結構 返回型別 operator 需要過載的操作符 形參列表 注意 形引數目應和運算元數目相同。2.過載操作符的幾條注意事項 1 過載的操作符名不能通過連線其他合法符號來建立任何新的操作符。如 2 過載操作符必須具備至少乙個類型別或列舉型別的運算元。...
c 操作符過載
過載操作符 一 限制 1 不能增加新的操作符 2 有些操作符不能過載,如.物件中的訪問成員 作用域解析操作符 sizeof 三元操作符 3 不能改變操作符的元數,元數是指與操作符相關的引數或運算元個數。比如一元操作符 只能應用於乙個操作符 4 不能改變操作符的優先順序 5 不能重新定義內建型別的操作...