感覺自己的**能力還在很弱,所以又第二遍仔細的閱讀劍指offer了
第二章 面試需要的基礎知識
所謂賦值運算函式就是對=這個操作符進行過載,從而使等號能夠直接用於兩個例項之間的賦值。這個c++課上學過,不過現在忘完了,只記得學過。
需要考慮的點
返回值的型別宣告為該型別的引用,在函式結束前返回例項自身的引用(*this)。只有返回乙個引用,才可以連續賦值。object1=object2=object3
就是連續賦值。賦值採用右結合律,從最右邊開始計算。不然的話當首先執行完object2=object3
後,object2
雖然自己的成員已經得到了更改,但是它不能再作為object1=object2
這個等號的右值,因為在前乙個=的執行中,它沒有獲得返回值。而返回物件的話,就需要重新執行新建乙個物件和銷毀物件的構造與析構操作,增加不必要開銷,降低賦值函式的效率。
傳入的引數申明為常量引用釋放例項自身已有的記憶體判斷傳入引數是否和當前的例項相同,相同的話不進行賦值操作,直接返回例項。
**:初級版
cmystring& cmystring::operator = (const cmystring& str)
**:高階版
cmystring& cmystring::operator = (const cmystring& str)
return *this;
}
初級版在使用new分配記憶體的時候,已經把原來的資料給清楚了(delete m_pdata;
),這時在新分配記憶體的時候,如果記憶體不足會導致new char丟擲異常,使得m_pdata 變成乙個空指標,這樣很容易導致程式崩潰。因為在丟擲異常之後,原來的cmystring例項因為資料被delete了,所以不再保持有效的狀態,違背了異常安全性的原則。 (可以先將原來的資料備份,等new 成功了,再將原來的資料delete給釋放掉)
**思路:新建乙個例項,新建乙個臨時指標從而用於資料交換。
tmp tmp
^ |
|
str<--this
先將str的值備份到tmp中,然後將str的值更新為this的值,然後在把this的值更新為tmp的值
兩個資料的交換必然需要新建第三個變數來存放其中乙個變數的值。
之所以需要新建乙個例項是因為例項是個臨時變數,所以完成操作後會自動釋放掉他的資料,也就是原來的資料。
指標與引用的異同
常量指標與常量引用。
對於引用只有兩種描述:
// 對常量型別的引用
const type &ref = type a;
//對變數型別的引用
type &ref = type a;
對常量型別的引用 實際上既可以對常量型別引用,也可以對變數型別引用,但是不能通過引用來修改它引用的物件。
對於指標的修飾有4種:
// 普通的指標 poi is a pointer point to a type ,
//指標的值(指向的位址,可以改變),被指向的變數的值也可以改變
type *poi;
//常量指標 poi is a const pointer point to a type
//指標的值(指向的位址)不能改變,被指向的變數的值可以改變
type *const poi;
// poi is a pointer point to a const type
//指標的值(指向的位址)可以改變,所以指標可以指向其他變數,
//被指向的變數的值不可以改變,所以指標不能修改指向的變數的值,
const type *poi;
// poi is a const pointer point to a const type
// 指標的值(指向的位址)不能改變,所以指標不能指向其他變數,
//被指向的變數的不可以改變,所以指標不能修改指向的變數的值
const type *const poi;
以* &作為分割符進行讀取,const作為字首修飾的物件,物件儲存的值不變。
對於指向const type 的指標或者引用而言,指向的(引用的)變數型別不一定是常量,但是無法通過指標或者引用來修改其指向的(引用的)變數的值。《c++primer》中所說:所謂指向常量的指標或引用,不過是指標自以為自己指向了乙個常量,所以自覺地不去改變所指物件的值。
為什麼申明的返回值是引用,而返回的卻是指標?
傳入的引數是個常量引用,為什麼不使用常量指標:const cmystring *str
劍指offer讀書筆記(2)
1 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。public class solution 2 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於位於陣列的後半部分,並保證奇數和奇...
劍指offer讀書筆記
1 陣列 陣列佔據一塊連續記憶體,按順序儲存元素。定義陣列時,因為陣列中資料連續,需要事先指定陣列規模大小,根據大小分配記憶體。由於陣列記憶體連續,可以在o 1 時間內讀 寫任何元素,因此可以用陣列來實現簡單的hash表。為解決陣列空間效率不高的問題,設計了多種動態陣列,比如vector。陣列和指標...
《劍指offer》筆記 第5章(2)
面試題42 連續子陣列的最大和 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度是o n 例如,陣列為,和最大的子陣列為,輸出位18。測試用例 功能測試 陣列中有正數也有負數 陣列中只有正數 陣列中只有負數 特殊輸入 陣列為nu...