日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性

發布時間:2025/4/5 c/c++ 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++類進行初始化的兩種方式。

使用/調用拷貝構造函數的情況

  拷貝構造函數的作用主要是復制對象

  • 復制對象,并通過函數返回復制后的對象。
  • 一個對象以值傳遞的方式傳入函數,此時必定調用拷貝構造函數,即void Func(Test test){}這類。
  • 一個對象以另一個對象為例進行初始化,以上Test t2=t1;即是此例。
  • 必須顯式定義拷貝構造函數的情況

       對于拷貝來講,尤其需要注意的即是指針和動態分配的資源,這些很容易造成拷貝變成淺拷貝(指向復制前后的變量指向同一塊內存區域)。
      因此如果類的成員變量包含指針類型,或者有成員表示在構造函數中分配的其他資源,這兩種情況下都必須顯式的定義拷貝構造函數。

    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特性的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。