第十三章 拷貝控制
在定義任何c++類時,拷貝控制操作都是必要部分。
拷貝建構函式的第乙個引數必須是引用型別,且是自身類型別的引用。
拷貝建構函式在幾種情況會被隱式使用,所以不應該是explicit
合成拷貝建構函式會進其引數的成員逐個拷貝到正在建立的物件中
每個成員的型別決定了它的拷貝方式:對於類型別的成員,使用拷貝建構函式來拷貝;內建型別的成員則直接拷貝。不能直接拷貝乙個陣列,合成拷貝建構函式會逐元素地拷貝乙個陣列
直接初始化時,編譯器選擇與提供的引數最匹配的建構函式
拷貝初始化時,編譯器將右側運算物件拷貝到正在建立的物件中,如有需要將進行型別轉換
拷貝初始化通常由拷貝建構函式來完成,但如果乙個類有移動建構函式,則使用移動建構函式來完成
拷貝初始化發生的情況:a,使用=定義變數;b,將乙個物件作為實參傳遞給乙個非引用型別的形參;c,從乙個返回型別為非引用型別的函式返回乙個物件;d,用花括號列表初始化乙個陣列中 的元素或乙個聚合類的成員
某些類型別還會對他們分配的物件進行拷貝初始化。例如,初始化標準庫容器或者呼叫其insert或push成員,容器會對其元素進行拷貝初始化;用emplace成員進行直接初始化.p308
在函式呼叫過程中,具有非引用型別的引數要進行拷貝初始化
拷貝建構函式被用來初始化非引用類型別引數,這一特性解釋了為什麼拷貝建構函式自己的引數必須是引用型別的。如果其引數不是引用型別,則呼叫永遠不會成功
賦值運算子通常應該返回乙個指向其左側運算物件的引用
析構函式釋放物件使用的資源,並銷毀物件的非static資料成員。不接受引數也沒有返回值。由於不接受引數,故不能過載。對於乙個給定類,只有唯一的析構函式
在乙個建構函式中,成員的初始化是在函式體執行之前完成,且按照他們在類中出現的順序初始化。
在乙個析構函式中,首先執行函式體,然後銷毀成員。成員按初始化順序的逆序銷毀
析構部分是隱式的。內建型別沒有析構函式,類型別的成員執行成員自己的析構函式。
隱式銷毀乙個內建指標型別的成員 不會delete它所指向的物件。
與普通指標不同,智慧型指標是類型別,有析構函式
無論乙個物件何時被銷毀,都會自動呼叫其析構函式:a,變數在離開其作用域時被銷毀;b,當乙個物件被銷毀,其成員也被銷毀 ;c,容器被銷毀時,其元素被銷毀;d,對於動態分配的物件,當對指向它的指標應用delete運算子時被銷毀;e,對於臨時物件,當建立它的表示式結束時被銷毀
當指向乙個物件的引用或指標離開作用域時,析構函式不會執行。
析構函式本身並不直接銷毀成員,成員是在析構函式體之後隱含的析構部分被銷毀。
如果合成析構函式是空的,則銷毀成員;如果非空,一般是類用來阻止該型別的物件被銷毀
需要析構函式的類也幾乎肯定需要拷貝和賦值操作
需要拷貝操作的類也需要賦值操作,反之亦然
需要拷貝函式/賦值運算子,不必然意味著需要析構函式
當我們在類內用=default修飾成員的宣告時,合成的函式將隱式地宣告為內聯
我們只能對具有合成版本的成員函式使用=default
我們可以將拷貝建構函式和拷貝賦值運算子定義為刪除的函式來阻止拷貝。刪除的函式:我們雖然宣告了它們,但不能以任何方式使用他們。在引數列表後加上=delete。
=deleted必須出現在函式第一次宣告的時候
析構函式不能是刪除的成員
本質上,當不可能拷貝,賦值或銷毀類的成員時,類的合成拷貝控制成員就被定義為刪除的
希望組織拷貝的類應該使用=delete來定義它們自己的拷貝建構函式和拷貝賦值運算,而不應該將它們宣告為private
管理類外資源的類必須定義拷貝控制成員。
io型別和unique_ptr不允許拷貝或賦值,所以它們的行為既不像值也不像指標
使用拷貝和交換的賦值運算子自動就是異常安全的,且能正確處理自賦值
p461~p489 控制操作案例+動態記憶體管理(尚未學習)
Linux筆記第三部分
最近開學什麼的事比較多,然後今天開始學校安排了培訓,全日制,早上9點到晚上7點,遭不住,不過培訓的機器用的ubantu,頓時覺得自己會玩的 捂臉 linux 13linux使用者基礎 1.使用者 用來限制使用者或程序可以使用的資源 組 用來方便組織管理使用者 2.每個使用者 組 都會有乙個useri...
Linux筆記第三部分
etc passwd中儲存了使用者資訊,etc shadow中儲存了密碼的hash結果。etc passwd中的gid指的是初始使用者組,即使用者登入系統就會擁有這個使用者組的相關許可權 有效使用者組指的是touch乙個新檔案時,生成檔案的所以組,可以通過groups命令檢視,第乙個即為有效使用者組...
劇本第三部分
第三部分劇本 場景一 女生宿舍,a趴在桌子上睡覺,電腦螢幕亮著,是vs 但是就寫了一行 小碼趴在a的胳膊上睡著。突然,a醒了,發現自己上課要遲到了,a 哎呀,完了完了,大中午的怎麼趴在這睡著了 邊說話邊收拾書包 轉頭看向小碼 a 把你放哪呢 說話的時候四周環視 算了,跟我去吧,我先把你放書包裡 說話...