自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

三分鐘讀懂C++深淺拷貝:避免常見陷阱!

開發(fā)
智能指針就像是魔法世界中的掃地機器人,自動幫你清理和管理資源,讓你專注于創(chuàng)造更多的魔法奇跡!

嘿!想象一下你是個小魔法師,手里有一本超級無敵珍貴的魔法書,里面藏著各種神奇的咒語和配方。某天,你最好的魔法師朋友看到你念咒語變出了一只可愛的小兔子,興奮地問你能不能也學習這些魔法...

淺拷貝:一本書的兩個主人

想象一下,你有一本超級珍貴的魔法書,里面記載著各種神奇咒語 ??。有一天,你的好朋友特別想要這本書,于是你用了個復制咒語(淺拷貝)。但是!這個咒語有點調(diào)皮,它并沒有真的復制出一本新書,而是給了你朋友一個新書簽,指向的還是你那本原始的魔法書!

class MagicBook {
    char* spells;  // 魔法咒語在這里 ?
public:
    MagicBook(const char* text) {
        spells = new char[strlen(text) + 1];  // 為咒語騰出空間 ??
        strcpy(spells, text);  // 把咒語寫進書里 ??
    }
};

// 哎呀!這樣復制書是很危險的 ??
MagicBook book2 = book1;  // 兩個魔法師共享一本書,太冒險了!??

這下可有趣了!如果你的朋友不小心把書弄臟了或者弄丟了(對象被銷毀),你的書也會跟著消失。因為實際上你們根本就是在共用同一本書嘛!就像兩個人拿著同一本書的鑰匙,一個人把書扔了,另一個人也找不到書了!這就是淺拷貝帶來的"一損俱損"的尷尬情況啦!

什么時候需要深拷貝?讓魔法告訴你!

想象一下,當你的魔法書里藏著一些特殊的寶物(指針成員)或者神奇的空間袋(動態(tài)分配的資源)時,簡單的復制咒語可不夠用啦!這時候就需要一個更強大的深拷貝魔法,它能完完整整地復制出一本全新的魔法書,讓每位魔法師都擁有屬于自己的獨立寶藏!

來看看這本超級魔法書是怎么施展深拷貝魔法的吧:

class AdvancedMagicBook {
    char* title;         // 魔法書的真名 ??
    int* pageNumbers;    // 神秘頁碼 ??
    size_t pageCount;    // 書的厚度 ??
    
public:
    // 創(chuàng)造一本全新的魔法書 ??
    AdvancedMagicBook(const char* bookTitle, size_t pages) {
        pageCount = pages;
        title = new char[strlen(bookTitle) + 1];      // 為書名開辟魔法空間 ?
        strcpy(title, bookTitle);                     // 寫下神秘的書名 ??
        pageNumbers = new int[pages];                 // 為每頁施加編號魔法 ??
        for(size_t i = 0; i < pages; i++) {
            pageNumbers[i] = i + 1;
        }
    }
    
    // 完美復制魔法書的咒語 ??
    AdvancedMagicBook(const AdvancedMagicBook& other) {
        pageCount = other.pageCount;
        
        title = new char[strlen(other.title) + 1];    // 復制書名魔法 ??
        strcpy(title, other.title);
        
        pageNumbers = new int[pageCount];             // 復制頁碼魔法 ??
        memcpy(pageNumbers, other.pageNumbers, pageCount * sizeof(int));
    }
    
    // 魔法書使用完畢,清理咒語 ??
    ~AdvancedMagicBook() {
        delete[] title;         // 消除書名魔法 ?
        delete[] pageNumbers;   // 清除頁碼魔法 ??
    }
};

這樣,每位魔法師都能擁有自己獨一無二的魔法書啦!再也不用擔心和其他魔法師共用一本書帶來的各種麻煩了!

深拷貝小貼士:魔法師必讀

親愛的魔法師朋友們,在使用深拷貝魔法時要特別小心哦!想象一下,當你復制一本超大的魔法書時,需要消耗不少魔法能量呢(占用更多內(nèi)存)!就像搬家一樣,把所有東西都復制一遍確實很累人。

有時候施展深拷貝魔法可能會遇到一些小意外,比如魔法能量不夠用了(內(nèi)存分配失敗)。別擔心,我們有一個超級安全的魔法配方 ??,它能確保即使魔法失敗了,你的寶貴魔法書也不會受到任何損害!

// 看看這個超級安全的魔法配方 ?
AdvancedMagicBook& operator=(const AdvancedMagicBook& other) {
    if (this != &other) {  // 先確認不是自己給自己施法 ??
        // 準備新的魔法材料 ??
        char* newTitle = new char[strlen(other.title) + 1];
        int* newPages = new int[other.pageCount];
        
        // 小心翼翼地復制魔法內(nèi)容 ??
        strcpy(newTitle, other.title);
        memcpy(newPages, other.pageNumbers, other.pageCount * sizeof(int));
        
        // 清理舊的魔法痕跡 ??
        delete[] title;
        delete[] pageNumbers;
        
        // 注入新的魔法能量 ?
        title = newTitle;
        pageNumbers = newPages;
        pageCount = other.pageCount;
    }
    return *this;
}

不過等等!現(xiàn)代魔法世界已經(jīng)發(fā)展出了更智能的法術啦!它們就像會自動打掃的掃帚一樣,幫我們處理各種復雜的資源管理問題??靵砜纯催@個超酷的智能魔法吧!

智能魔法:使用智能指針

嘿,親愛的魔法師朋友們!現(xiàn)代 C++ 就像是魔法世界中的一場革命,為我們帶來了更智能的資源管理方式!想象一下,智能指針就像是你的小助手,幫你打理一切復雜的資源問題,讓你輕松無憂地施展魔法!

#include <memory>

class ModernMagicBook {
    std::unique_ptr<char[]> spells;  // 獨一無二的魔法咒語 ??
    std::shared_ptr<int> usageCount; // 共享的魔法能量計數(shù)器 ??
    
public:
    ModernMagicBook(const char* text) {
        spells = std::make_unique<char[]>(strlen(text) + 1); // 為咒語開辟獨特空間 ?
        strcpy(spells.get(), text); // 將咒語銘刻在書中 ???
        usageCount = std::make_shared<int>(0); // 初始化魔法能量計數(shù)器 ??
    }
    
    // 使用智能指針,編譯器生成的拷貝構造函數(shù)就能正確處理資源了!?
};

智能指針就像是魔法世界中的掃地機器人,自動幫你清理和管理資源,讓你專注于創(chuàng)造更多的魔法奇跡!

總結

  • 淺拷貝適用于簡單的值類型對象
  • 當類包含指針或動態(tài)資源時,必須實現(xiàn)深拷貝
  • 考慮使用智能指針來自動管理資源
  • 記住編寫析構函數(shù)、拷貝構造函數(shù)和賦值運算符的規(guī)則

現(xiàn)在你已經(jīng)掌握了深淺拷貝的魔法精髓,去創(chuàng)造你自己的魔法世界吧!

責任編輯:趙寧寧 來源: everystep
相關推薦

2021-10-27 05:47:53

通信協(xié)議協(xié)議網(wǎng)絡技術

2025-02-13 08:04:49

spliceCPU數(shù)據(jù)

2024-05-16 11:13:16

Helm工具release

2009-11-09 12:55:43

WCF事務

2024-12-18 10:24:59

代理技術JDK動態(tài)代理

2022-02-17 09:24:11

TypeScript編程語言javaScrip

2021-04-20 13:59:37

云計算

2023-12-27 08:15:47

Java虛擬線程

2024-01-16 07:46:14

FutureTask接口用法

2024-08-30 08:50:00

2013-06-28 14:30:26

棱鏡計劃棱鏡棱鏡監(jiān)控項目

2020-06-30 10:45:28

Web開發(fā)工具

2024-12-17 08:10:00

C++20LambdaC++

2021-12-17 07:47:37

IT風險框架

2024-10-15 09:18:30

2021-02-03 14:31:53

人工智能人臉識別

2024-01-12 07:38:38

AQS原理JUC

2024-07-05 09:31:37

2009-11-05 16:04:19

Oracle用戶表

2020-06-29 07:42:20

邊緣計算云計算技術
點贊
收藏

51CTO技術棧公眾號