C++基礎回顧5——類的拷貝、複製和銷燬
拷貝建構函式
class Foo
{
Foo(); //預設建構函式
Foo(const Foo&); //拷貝建構函式
}
拷貝建構函式的第一個引數必須是引用型別,在函式呼叫過程中,具有非引用型別的引數要進行拷貝初始化。同樣,當一個函式具有非引用的返回型別時,返回值會被用來初始化呼叫方法的結果。
因此,如果拷貝建構函式的引數不是引用型別,為了呼叫拷貝建構函式,我們必須拷貝實參,這個過程又需要呼叫拷貝建構函式,如此將是一個無限迴圈。
一般而言,合成拷貝建構函式會將其引數的成員逐個拷貝到正在建立的物件中:
類型別->使用其拷貝建構函式來拷貝;
內建型別->直接拷貝;
陣列型別->逐個元素拷貝至一個陣列,如果陣列的元素是類型別,則使用元素的拷貝建構函式來進行拷貝。
string dot(10, '.'); //直接初始化
string s(dot); //直接初始化
string s2 = dot; //拷貝初始化
string null_book = "99-99-99-99-99"; //拷貝初始化
string nines = string(100, '9'); //拷貝初始化
直接初始化:要求編譯器使用普通的函式匹配;
拷貝初始化:用拷貝構造初始化將右側的物件拷貝至正在建立的物件中。
拷貝初始化的發生情況:
- 將物件作為實參傳遞給非引用型別的形參;
- 從返回型別為非引用型別的函式;
用花括號列表初始化一個陣列中的 元素或一個聚合類中的成員。
拷貝賦值運算子
賦值運算子通常返回一個指向其左側運算物件的引用
class Foo
{
public:
Foo(); //預設建構函式
Foo& operator=(const Foo&); //賦值運算子
//...
};
過載運算子的參數列示運算子的操作物件,某些運算子,包括賦值運算子,必須定義為成員函式。如果一個運算子是一個成員函式,其左側運算物件就繫結到隱式的this引數上。
Sales_data&
Sales_data::operator=(const Sales_data& rhs)
{
bookNo = rhs.bookNo;
units = rhs.units;
revenue = rhs.revenue;
return *this;
}
解構函式
在一個解構函式中,首先執行函式體,然後銷燬成員。成員按初始化的順序逆序銷燬。銷燬類成員需要執行成員自己的解構函式。
是麼時候呼叫解構函式:
- 變數在離開其作用域時銷燬;
- 當一個物件被銷燬時,其成員被銷燬;
- 容器被銷燬,其元素也會被銷燬;
- 動態分配的物件,應用delete時被銷燬
- 對於臨時物件,建立完整表示式結束時被銷燬
-
相關文章
- C++淺拷貝和深拷貝C++
- js 淺拷貝(淺複製、淺克隆)、深拷貝(深複製、深克隆)JS
- C#基礎知識回顧:1.由WeakReference想到物件的建立與銷燬C#物件
- Python基礎學習13-淺拷貝和深拷貝Python
- C++派生類的拷貝構造C++
- js陣列物件複製拷貝不改變原來的值,深拷貝JS陣列物件
- C++拷貝建構函式(深拷貝,淺拷貝)C++函式
- 【OpenCV】幾種Mat類拷貝複製方法對比_親測有效OpenCV
- C++基礎回顧4——動態陣列C++陣列
- Java IO 流之拷貝(複製)檔案Java
- js的深拷貝和淺拷貝JS
- 淺拷貝和深拷貝
- 深拷貝和淺拷貝
- js 基礎加固之深拷貝JS
- 一文帶你瞭解js資料儲存及深複製(深拷貝)與淺複製(淺拷貝)JS
- python 指標拷貝,淺拷貝和深拷貝Python指標
- VUE 中 的深拷貝和淺拷貝Vue
- 對淺拷貝和深拷貝的理解
- Java深拷貝和淺拷貝Java
- 物件深拷貝和淺拷貝物件
- JavaScript深拷貝和淺拷貝JavaScript
- JavaScript 深度拷貝和淺拷貝JavaScript
- js 淺拷貝和深拷貝JS
- iOS深拷貝和淺拷貝iOS
- js 深拷貝和淺拷貝JS
- JavaScript淺拷貝和深拷貝JavaScript
- 深入JavaScript基礎之深淺拷貝JavaScript
- js 陣列的淺拷貝和深拷貝JS陣列
- C++基礎回顧4——智慧指標shared_ptrC++指標
- Mac拷貝/複製資料夾路徑快捷鍵Mac
- JavaScript之深拷貝和淺拷貝JavaScript
- ECMAScript-淺拷貝和深拷貝
- 聊聊物件深拷貝和淺拷貝物件
- go slice深拷貝和淺拷貝Go
- js之淺拷貝和深拷貝JS
- 深度解析深拷貝和淺拷貝
- js的淺拷貝和深拷貝和應用場景JS
- 淺談Java中的淺拷貝和深拷貝Java