過載運算和型別轉換
輸入輸出運算子過載:
當流讀取資料時發生錯誤,輸入運算子應該負責從錯誤裡面恢復;
算數運算子和關係運算子;
下標運算子:可以通過位置訪問元素的一種方法,通常需要定義下表運算子operator
,下標運算子必須是成員函式.
下標運算子應該包含兩個版本,乙個返回普通引用,另乙個是類的常量成員,並且返回常量引用,使用引用作為返回值,下標可以出現在賦值運算子的任何一段;
class strvec
const
string& operator(size_t n)const
private:
string *elements;
};
遞增遞減運算子:遞增,遞減運算子,c++
並不要求必須是類的成員,但是因為會改變操作物件的狀態,所以將其設定未成員函式;
遞增遞減運算子應該同時定義前置和後置版本,通常設定為類的成員;
前置遞增遞減:
class strblobptr
strblobptr& operator--()
};
前置運算子應該返回遞增或者遞減後物件的引用;
後置運算子
class strblobptr //後置運算子;
strblobptr operator--(int) //後置運算子;
};
為了保持與內建版本一致,後置運算子應該返回物件的原值(也就是遞增或則遞減之前的值),返回的是值,而不是引用.
因為我們不會用到int
的形參,所以不需要命名;
成員訪問運算子,通常在迭代器或者智慧型指標中常常使用解引用運算子(*)
運算子和箭頭運算子(->)
.
class strblobptr
string* operator->()const
};
箭頭運算子必須是類的成員,解引用運算子通常也是類的成員,但是並非必須如此;
箭頭運算子返回值的限定:
函式呼叫運算子
lambda
:編譯器將乙個lambda
翻譯成乙個未命名類的未命名物件.在lambda
表示式禪城的類中含有乙個過載的函式呼叫運算子;
stable_sort(words.begin(),words.end(),
(const
string &a,const
string &b));
上面函式的行為類似於:
class shorterstring
};
在預設情況下.lambda
不能夠改變它所捕獲的變數.所以上面的類應該是const
型別的;
當lambda
表示式引用變數時,由程式負責保證lambda
所引用的物件時存在的,所以編譯器可以直接使用,而不用進行儲存;
如果是通過值捕獲的變數,在對應的類裡面就需要建立相應的資料成員,同時建立建構函式,使用捕獲的變數來初始化資料成員;
auto wc = find_if(words.begin(),words.end(),[sz](const
string &a));
轉換為類的形式:
class sizecomp
bool
operator()(const
string &s)const
private:
size_t sz; //需要使用這個變數來儲存捕獲的變數;
};
lambda
表示式產生的類不喊又預設建構函式,賦值運算子以及預設的析構函式,是否需要含有預設的拷貝/移動建構函式需要根據資料成員的型別來確定;
標準庫定義的函式物件,標準庫定義的大多數函式物件唯一標頭檔案functional
裡面;
可呼叫物件和function
:
標準庫function
型別
過載.型別轉換與運算子
向bool
的型別轉換通常用在條件部分,因此operator bool
一般定義為explict
的;
總結就是說:除了顯示地向bool
型別的轉換之外,應該盡量避免定義型別轉換函式並盡可能的限制那些顯然正確的非顯示建構函式.
過載函式與轉換建構函式
Chapter14 過載運算子
對於乙個運算子函式來說,它或者是類的成員,或者至少含有乙個類型別的引數。1 intoperator int,int 錯誤,不能為int重定義內建運算子 對於乙個過載的運算子來說,其優先順序和結合律與對應的內建運算子保持一致。1 x y z2 永遠等價於 3 x y z 邏輯與運算 邏輯或運算和逗號運...
過載運算子
題目描述 定義乙個矩形類,資料成員包括左下角和右上角座標,定義的成員函式包括必要的建構函式 輸入座標的函式,實現矩形加法,以及計算並輸出矩形面積的函式。要求使用提示中給出的測試函式並不得改動。兩個矩形相加的規則是 決定矩形的對應座標分別相加,如 左下角 1,2 右上角 3,4 的矩形,與 左下角 2...
過載運算子
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 比較物件...