過載運算子與內建運算子:
區別:1)某些運算物件的求值規則無法在過載運算子中儲存下來.比如&&和||的短路求值特性被捨棄.
2)過載運算子必須要求至少有乙個成員是class型別
相同:1)一般來說,優先順序,結合律和運算元的數目是一致的.
2)一般來說,表達的邏輯是相同的.
friend std::istream&
operator
>>
(std::istream& is, sales_data&);
friend std::ostream&
operator
<<
(std::ostream& os,
const sales_data&);
friend sales_data operator+(
const sales_data& s1,
const sales_data& s2)
; sales_data&
operator+=
(const sales_data& s)
;
std::istream&
operator
>>
(std::istream& is, sales_data& tmp)
std::ostream&
operator
<<
(std::ostream& os,
const sales_data& tmp)
sales_data operator+(
const sales_data& s1,
const sales_data& s2)
else
throw
runtime_error
("不可相加");
}
應該是類的成員的:
%= (改變物件狀態),
++ (改變物件狀態),
-> (與給定型別密切相關),
() (必須是)
其實都不應該是.
原因:有4個必須是成員: =,,(),->
復合賦值應該是.
改變物件狀態的,或者與給定型別密切相關的運算子,如:++,–,* 應該是.
具有對稱性的一般不是.
全部應該定義,最起碼的<<,>>,==,!=,是很有必要定義的
部分例子:
friend std::ostream&
operator
<<
(std::ostream& os,
const book& b)
;friend std::istream&
operator
>>
(std::istream& is,book& b)
;friend book operator+(
const book& b1,
const book& b2)
;
見練習14.2
friend std::ostream&
operator
<<
(std::ostream& os,
const string& s)
;
上面有
上面有(a) 正常讀入
(b)生成預設的物件,流狀態被值錯誤位
輸入運算子必須處理輸入可能失敗的情況.
如果仍按上述練習輸入,程式將會丟擲異常.
std::istream&
operator
>>
(std::istream& is, date& date)
宣告個減法:
friend sales_data operator-(
const sales_data& s1,
const sales_data& s2)
;
可讀性高,重用**,方便更改.
應該.
friend
bool
operator==(
const strvec& s1,
const strvec& s2)
;friend
bool
operator!=(
const strvec& s1,
const strvec& s2)
;
bool
operator==(
const strvec& s1,
const strvec& s2)
bool
operator!=(
const strvec& s1,
const strvec& s2)
應該有,基本每個類都應該有.
friend
bool
operator==(
const person& p1,
const person& p2)
;friend
bool
operator!=(
const person& p1,
const person& p2)
;
bool
operator==(
const person& p1,
const person& p2)
bool
operator!=(
const person& p1,
const person& p2)
sales_data& sales_data::
operator+=
(const sales_data& s)
sales_data operator+(
const sales_data& s1,
const sales_data& s2)
本題無任何效能提公升,同時可讀性差
sales_data& sales_data::
operator=(
const std::string no)
strvec& strvec::
operator
=(initializer_list il)
person::
person
(const person& p)
person::
person
(person&& p)
不用定義別的啦
string&
operator
(size_t n)
const string&
operator
(size_t n)
const
strblobptr& strblobptr::
operator++(
)strblobptr& strblobptr::
operator--(
)strblobptr strblobptr::
operator++(
int)
strblobptr strblobptr::
operator--(
int)
strblobptr strblobptr::
operator+(
int n)
strblobptr strblobptr::
operator-(
int n)
因為要改變物件的狀態.
略
C Prime 第14章後23題
智慧型指標或內建型別,可以自己管理自己擁有的資源,於是使用編譯器合成的拷貝控制函式就滿足要求了.classx private strblobptr ptr 過載的函式呼叫運算子最少接受0個物件,最多接受無限個物件.pragma once include using namespace std 圖省事...
C Prime 第九章前30題
a 選擇list,因為可能在容器中間插入元素.也可以選擇vector,全部讀取完畢後,直接sort.b 選擇deque,因為插入刪除操作只在頭部進行.c 選擇vector.list data 迭代器範圍 兩個迭代器指向同一容器,或者是容器最後乙個元素之後的位置,begin遞增若干次後等於end.in...
C Prime14章學習筆記
過載的運算子是具有特殊名字的函式,它由關鍵字 operator與後面定義的符號組成,過載函式包含返回型別,引數列表以及函式體。過載運算子的引數數量與該運算子的作用的運算物件數量一樣多。如果乙個運算子函式是成員函式,則其第乙個運算物件繫結到this指標上。注意 對於乙個運算子函式來說,它或者是類的成員...