1) :: .* . ?: 這4個符號不能過載
2) 過載操作必須有乙個類型別的運算元(強制過載操作符不能重新定義在已有的內建型別中)
3) 優先順序和結合性是固定的
4) 過載後&&不再具有短路求值特性
1) 必須作為非成員函式
2) 輸出
ostream& operator<< (ostream& os,const classtype &object)
3) 輸入
必須處理錯誤和檔案結束的可能性
istream& operator<< (istream& in,const classtype &object)
1) 一些例子
a operator+(const a& a,const a& b);//注意返回值為了與內建操作保持一致,沒有設定為引用,+可以通過+=來實現.
inline bool operator == (const a&a,const a&b);//一般在實現!=等操作的時候,使用==
2) 對於《操作符,由於很多關聯容器和演算法需要,最好定義為非成員函式.
必須返回*this
由於可能對const 和非const物件都使用下標操作符,所以一般 宣告如下
int& operator(const size_t);
const int& operator(const size_t) const ;
例子:
a& operator*()
a* operator->()
const a& operator*() const
const a* operator->() const
過載箭頭操作符必須參會指向類型別的指標,或定義了自己的指標操作符的類物件.
例子:
a& operator++()//前
a& operator++(int)//後,標識了乙個int型別的0來區別前後++
1) 例子:
struct absint };
int i=-42;
absint absobj;
unsigned int ui = absobj(i);//類似於函式的使用方式,但是比函式方便;
2) 用於標準庫演算法
class gt_cls
bool operator()(const string&s)
private:
std::string ::size_type bound; };
count_if(words.begin(),words.end(),gt_cls(6));//返回長度小於6的string的數量
3) 標準庫定義了一組物件類在functional標頭檔案中
plus+
minus-
multiplies*
divides/
modulus%
negate-
equal_to==
not_equal_to!=
greater>
greater_equal>=
less<
less_equal<=
logical_and&&
logical_or||
logical_not!
例子:
sort(svec.begin(),svec.end(),greater());//降序排列string
4) 函式物件對應的函式介面卡
bind2nd
not1()
例子:
count_if(vec.begin(),vec.end(),bind2nd(less_equal(),10));//小於10元素的個數的統計出來
count_if(vec.begin(),vec.end(),not1(bind2nd(less_equal(),10)));//不小於10
第十四章 過載操作與轉換 二
14.9 轉換與類型別 1 轉換操作符 例子 class smallint operator int const 沒有返回型別,沒有引數列表,const型別 private stad size t val 2 只要存在轉換,編譯器就會在內建轉化的地方就會自動應用之,所以一般乙個類中乙個型別轉換就足夠...
第十四章 過載操作符與轉換
第十四章 過載操作符與轉換 1 過載操作符 保留字operator後接需定義的操作符符號 過載操作符不能重新定義用於內建型別物件的操作符,至少有乙個類型別或列舉型別 操作符定義為非成員函式時,必須設定為所操作類的友元 2 輸入和輸出操作符 輸出操作符應輸出物件的內容,進行最小限度的格式化 輸入操作符...
C Primer 第十四章 過載操作符與轉換
14.1 過載操作符的定義 操作符 可以被內建型別使用,比如兩個整數相加或相減,兩個字串相加,兩個陣列比較大小等等。自定義類預設是不能使用大多數操作符的。自定義類是復合型別,相加或想減或比較大小並沒有相應的規則匹配 兩個類相加等於什麼?兩個類如何確定誰大誰小?c 允許我們通過過載運算子的技術讓自定義...