c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性
本文包含以下內容
1. C++的四類特殊成員函數介紹,重點介紹拷貝構造函數和拷貝復制運算符
2. C++11中的default/delete特性
本文內容側重個人理解,深入理解其原理推薦https://www.geeksforgeeks.org
前言
C++ 的類有四類特殊成員函數,分別是:
- 默認構造函數
- 析構函數
- 拷貝構造函數
- 拷貝賦值運算符
這些類的特殊成員函數負責創建、初始化、銷毀,或者拷貝類的對象。如果沒有顯式地為一個類定義某個特殊成員函數,而又需要用到該特殊成員函數時,則編譯器會隱式的為這個類生成一個默認的特殊成員函數。
sample
class Test{private:int _id;public:Test(int a); // 構造函數Test(const Test& test); // 拷貝構造函數Test& operator=(const Test& test); // 拷貝賦值運算符~Test(); // 析構函數 }1. 構造函數和拷貝構造函數
從名稱上也不難理解,構造函數和拷貝構造函數都是用于進行類實例初始化的
Test t1(2); // 調用實參匹配的構造函數 Test t2 = t1; // 調用拷貝構造函數,用t1對t2進行初始化以上也正是C++類進行初始化的兩種方式。
使用/調用拷貝構造函數的情況
拷貝構造函數的作用主要是復制對象
必須顯式定義拷貝構造函數的情況
對于拷貝來講,尤其需要注意的即是指針和動態分配的資源,這些很容易造成拷貝變成淺拷貝(指向復制前后的變量指向同一塊內存區域)。
因此如果類的成員變量包含指針類型,或者有成員表示在構造函數中分配的其他資源,這兩種情況下都必須顯式的定義拷貝構造函數。
2. 拷貝賦值運算符
通過定義拷貝賦值運算符,來實現類實例之間的=拷貝運算。
拷貝賦值運算符的通常形式為 classname& operator=(const classname& a)
拷貝賦值運算符與拷貝構造函數 以下例來觀察二者的不同:
Test t2 = t1; // 即上面的例子,調用的是拷貝構造函數,即在創建時進行初始化 Test t3; t3 = t1; // 此時調用拷貝賦值運算符,因為并不是在創建類的實例時進行初始化可以看出二者之間有很大的共通性,即都是為了進行完整的復制/拷貝而創立的,防止陷入淺拷貝造成內存安全問題。
3. C++11特性之default/delete
在未顯式的定義類的特殊成員函數時,如果被調用,系統會自動隱式的創建該特殊成員函數,且隱式的創建方式比顯式的創建方式執行效率高。
只需在函數聲明后加上=default;,就可將該函數聲明為 defaulted 函數,編譯器將為顯式聲明的 defaulted 函數自動生成函數體,以獲得更高的執行效率。
有些時候,我們需要禁用某些函數(=delete不僅可以禁用類內的特殊成員函數,也可以禁用一般函數),此時就需要在該函數后面增加=delete;,則該函數將變的不可調用,比如不可復制等。
sample:
class Test{private:int _id;public:Test() = default; // 定義默認構造函數Test(int a);Test(const Test& test) = delete; // 禁止使用拷貝構造函數的場景Test& operator=(const Test& test);~Test(); }總結
以上是生活随笔為你收集整理的c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wince6.0远程控制工具_【创新创效
- 下一篇: goland 远程调试go_手把手教你学