13.1.1 拷貝建構函式
當乙個建構函式的第乙個引數是自身型別的引用,且任何額外引數都有預設值,則此建構函式為拷貝建構函式
class
foo~hashptr
;
在進行拷貝的過程中,有可能指標指向同一記憶體,在呼叫構析函式時,會發現函式已經釋放。
13.1.5 使用=default
我們可以通過將拷貝控制成員定義為=default來顯示的要求編譯器生成合成建構函式。
class
sales_data
13.1.6阻止拷貝
定義刪除的函式
struct nocopy
hasptr
(const hasptr &p):ps
(p.ps),i
(p.i)
,use
(p.use)
hasptr&
operator=(
const hasptr&
) ps = rhs.ps;
use = rhs.use;
return
*this;}
~hasptr()
private
: string *ps;
int i;
size_t *use;
};
在使用swap函式的時候,採用交換指標的方式比拷貝的方式效率更高。
在呼叫swap函式時應該呼叫swap而不是std::swap。
13.6.1 右值引用
右值引用是指必須繫結到右值的引用。通常用&&來獲得。右值引用只能繫結乙個即將銷毀的物件。
與左值引用的區別,左值有持久的狀態,右值要麼是字面常量,要麼是表示式求值過程中建立的臨時物件。
可以通過呼叫utility標頭檔案中的move標準函式來顯示的將乙個左值引用轉換為右值引用。
int
&&rr3 = std::
move
(rr1)
13.6.2移動建構函式和移動賦值函式
與拷貝建構函式和拷貝賦值函式的區別:這兩個成員類似對應的拷貝操作,但它們從給定物件竊取資源而不是拷貝資源。
類似拷貝建構函式,移動建構函式的第乙個引數是乙個右值引用。與拷貝建構函式一樣。任何額外的引數都必須有預設實參。
example:
strvec::
strvec
(strvec &&s)
noexcept
//移動操作不丟擲任何異常。
//成員初試化接管s中的資源
: elements
(s.elemets)
,first_free
(s.first_free)
,cap
(s.cap)
{ s.elements = s.first_free = s.cap =
nullptr
;
與拷貝建構函式不同,移動建構函式不分配記憶體;它接管給定的strvec中的記憶體。在接管記憶體後,它給制定物件的指標都置為nullptr。這樣就完成了給定物件的移動操作。
不丟擲異常的移動建構函式和移動賦值運算子必須標記為noexcept
移動賦值運算子
移後源物件必須可析構
C Prime14章學習筆記
過載的運算子是具有特殊名字的函式,它由關鍵字 operator與後面定義的符號組成,過載函式包含返回型別,引數列表以及函式體。過載運算子的引數數量與該運算子的作用的運算物件數量一樣多。如果乙個運算子函式是成員函式,則其第乙個運算物件繫結到this指標上。注意 對於乙個運算子函式來說,它或者是類的成員...
《C Prime》第2章 閱讀筆記
2018 01 29 20 23 當乙個算術表示式中既有無符號數又有int值時,int值會轉換成為無符號數。相比於int a 3.14 和int a 3.14 當用於內建型別時,如果我們使用列表初始化且初始值存在丟失資訊的風險,則編譯器會報錯。定義在函式體內部的內建型別變數將不被自動初始化。下劃線開...
第13章 學習shell scripts
使用純文字檔案,將shell 的語法和指令 含外部指令 寫入文字,搭配正規表示法,管線命令,資料流重導向等功能,並提供陣列,條件,判斷,迴圈等重要功能,讓使用者以shell 來編寫程式,達到特定的功能。1.1 幹嘛學習shell scripts 自動化管理的重要依據。管理系統的工作,如service...