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