C Prime 第14章 前30題

2021-10-07 18:25:25 字數 3969 閱讀 9896

過載運算子與內建運算子:

區別: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指標上。注意 對於乙個運算子函式來說,它或者是類的成員...