最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中值傳遞時(shí)觸發(fā)拷貝構(gòu)造函數(shù)的完整過(guò)程

 更新時(shí)間:2025年12月26日 15:42:26   作者:挖礦大亨  
本文詳細(xì)介紹了C++中值傳遞時(shí)觸發(fā)拷貝構(gòu)造函數(shù)的完整過(guò)程,包括觸發(fā)拷貝構(gòu)造的時(shí)機(jī)、過(guò)程本質(zhì)以及如何避免觸發(fā)拷貝構(gòu)造,感興趣的朋友跟隨小編一起看看吧

當(dāng)函數(shù)的參數(shù)是類的對(duì)象(而非指針/引用)時(shí),調(diào)用函數(shù)傳遞參數(shù)的過(guò)程就是值傳遞,此時(shí)編譯器會(huì)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù),創(chuàng)建一個(gè)實(shí)參的“副本”作為函數(shù)的形參。

一、值傳遞觸發(fā)拷貝構(gòu)造函數(shù)的完整過(guò)程

可以把這個(gè)過(guò)程想象成“復(fù)制粘貼”
1、你準(zhǔn)備把一個(gè)已存在的對(duì)象(實(shí)參)傳給函數(shù)
2、因?yàn)槭侵祩鬟f,函數(shù)不會(huì)直接使用原對(duì)象,而是需要一個(gè)"獨(dú)立的副本"
3、編譯器會(huì)調(diào)用該類的拷貝構(gòu)造函數(shù),用原對(duì)象(實(shí)參)為模板,創(chuàng)建一個(gè)新的對(duì)象(形參);
4、函數(shù)內(nèi)部操作的是這個(gè)“副本”,函數(shù)執(zhí)行完畢后,副本會(huì)被銷毀(調(diào)用析構(gòu)函數(shù))
5、原對(duì)象不受函數(shù)內(nèi)操作的影響

二、代碼示例

#include <iostream>
#include <string>
using namespace std;
class Person {
public:
    string name;
    // 帶參構(gòu)造函數(shù)
    Person(string n) : name(n) {
        cout << "[構(gòu)造] 創(chuàng)建對(duì)象:" << name << endl;
    }
    // 拷貝構(gòu)造函數(shù)(核心:值傳遞時(shí)會(huì)調(diào)用)
    Person(const Person& other) {
        this->name = other.name + "(副本)"; // 給副本加標(biāo)記,方便識(shí)別
        cout << "[拷貝構(gòu)造] 為值傳遞創(chuàng)建副本:" << this->name << endl;
    }
    // 析構(gòu)函數(shù)
    ~Person() {
        cout << "[析構(gòu)] 銷毀對(duì)象:" << name << endl;
    }
    // 成員函數(shù):修改名字(僅影響副本)
    void changeName(string newName) {
        this->name = newName;
        cout << "[函數(shù)內(nèi)] 修改副本名字為:" << this->name << endl;
    }
};
// 函數(shù)參數(shù)為值傳遞(Person對(duì)象,而非指針/引用)
void testValuePass(Person p) {
    p.changeName("修改后的副本");
}
int main() {
    // 1. 創(chuàng)建原對(duì)象
    Person p1("原對(duì)象-張三");
    cout << "------------------------" << endl;
    // 2. 調(diào)用函數(shù),值傳遞參數(shù) → 觸發(fā)拷貝構(gòu)造
    testValuePass(p1);
    cout << "------------------------" << endl;
    // 3. 查看原對(duì)象:未被修改
    cout << "[主函數(shù)] 原對(duì)象名字:" << p1.name << endl;
    return 0;
}
控制臺(tái)
[構(gòu)造] 創(chuàng)建對(duì)象:原對(duì)象-張三
------------------------
[拷貝構(gòu)造] 為值傳遞創(chuàng)建副本:原對(duì)象-張三(副本)
[函數(shù)內(nèi)] 修改副本名字為:修改后的副本
[析構(gòu)] 銷毀對(duì)象:修改后的副本
------------------------
[主函數(shù)] 原對(duì)象名字:原對(duì)象-張三
[析構(gòu)] 銷毀對(duì)象:原對(duì)象-張三

三、關(guān)鍵細(xì)節(jié)拆解

1、觸發(fā)時(shí)機(jī)
執(zhí)行testValuePass(p1)時(shí),編譯器發(fā)現(xiàn)參數(shù)是值傳遞(Person p),立即調(diào)用Person(const Person& other);
拷貝構(gòu)造函數(shù)的參數(shù)other就是原對(duì)象p1,函數(shù)內(nèi)創(chuàng)建的p是p1的副本。
2、為什么必須是拷貝構(gòu)造?
如果沒有顯式定義拷貝構(gòu)造函數(shù),編譯器會(huì)生成默認(rèn)的淺拷貝構(gòu)造函數(shù),依然會(huì)觸發(fā)(只是沒有日志輸出);
只有參數(shù)是const 類名&的構(gòu)造函數(shù),才是拷貝構(gòu)造函數(shù),這是 C++ 的語(yǔ)法規(guī)則。
3、對(duì)比:避免拷貝構(gòu)造的方式
如果不想觸發(fā)拷貝構(gòu)造(提升性能,避免深拷貝開銷),可以把參數(shù)改成引用傳遞

// 引用傳遞:直接操作原對(duì)象,不觸發(fā)拷貝構(gòu)造
void testRefPass(Person& p) {
    p.changeName("修改原對(duì)象");
}
調(diào)用testRefPass(p1)時(shí),不會(huì)調(diào)用拷貝構(gòu)造函數(shù),函數(shù)內(nèi)修改的是原對(duì)象p1。

四、常見誤區(qū)澄清

×誤區(qū):“值傳遞只是把對(duì)象的值復(fù)制過(guò)去,和拷貝構(gòu)造無(wú)關(guān)”;
√正解:C++ 中,類對(duì)象的 “值復(fù)制” 本質(zhì)就是通過(guò)拷貝構(gòu)造函數(shù)完成的,這是面向?qū)ο蟮暮诵囊?guī)則。

五、總結(jié)

1、觸發(fā)條件:函數(shù)參數(shù)為類對(duì)象(值傳遞)時(shí),編譯器會(huì)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù),創(chuàng)建實(shí)參的副本作為形參。
2、過(guò)程本質(zhì):值傳遞的 “復(fù)制” = 拷貝構(gòu)造函數(shù)的調(diào)用 + 新對(duì)象(副本)的創(chuàng)建。
3、優(yōu)化建議:如果不需要修改原對(duì)象,用const 類名&(const 引用)傳遞參數(shù),既不觸發(fā)拷貝構(gòu)造,又能防止函數(shù)內(nèi)修改原對(duì)象。

到此這篇關(guān)于C++中值傳遞時(shí)觸發(fā)拷貝構(gòu)造函數(shù)的完整過(guò)程的文章就介紹到這了,更多相關(guān)c++值傳遞觸發(fā)拷貝構(gòu)造函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡(jiǎn)單談?wù)凜語(yǔ)言中的= 和==、!=

    簡(jiǎn)單談?wù)凜語(yǔ)言中的= 和==、!=

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中= 和==、!=的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • C++和python實(shí)現(xiàn)單鏈表及其原理

    C++和python實(shí)現(xiàn)單鏈表及其原理

    這篇文章主要介紹了C++和python實(shí)現(xiàn)單鏈表及其原理,單鏈表是鏈表家族中的一員,每個(gè)節(jié)點(diǎn)依舊由數(shù)據(jù)域(data)和指針域(next)組成,鏈表的具體概念下面文章將詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-03-03
  • 深入淺析OpenCV?copyTo()函數(shù)

    深入淺析OpenCV?copyTo()函數(shù)

    在Mat矩陣類的成員函數(shù)中copyTo(roi , mask)函數(shù)是非常有用的一個(gè)函數(shù),尤其是后面的mask可以實(shí)現(xiàn)蒙版的功能,下面通過(guò)本文給大家介紹下OpenCV copyTo()函數(shù)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2022-01-01
  • C語(yǔ)言 枚舉類型(Enum)詳解及示例代碼

    C語(yǔ)言 枚舉類型(Enum)詳解及示例代碼

    本文主要介紹C語(yǔ)言 枚舉類型,這里提供了詳細(xì)的相關(guān)資料及示例代碼,以便大家學(xué)習(xí)參考,有興趣的小伙伴可以參考下
    2016-08-08
  • C++從零配置ffmpeg的詳細(xì)過(guò)程

    C++從零配置ffmpeg的詳細(xì)過(guò)程

    本博文源于筆者正在做的任務(wù),將視頻mp4每幀轉(zhuǎn)換成jpg格式,前提是需要配置ffmpeg,因此本文從0下載教讀者如何配置ffmpeg,文中通過(guò)圖文結(jié)合的方式給大家介紹得非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實(shí)例代碼

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實(shí)例代碼

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C++實(shí)現(xiàn)LeetCode(98.驗(yàn)證二叉搜索樹)

    C++實(shí)現(xiàn)LeetCode(98.驗(yàn)證二叉搜索樹)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(98.驗(yàn)證二叉搜索樹),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言do關(guān)鍵字的具體使用

    C語(yǔ)言do關(guān)鍵字的具體使用

    本篇文章主要介紹了C語(yǔ)言do關(guān)鍵字的具體使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • C標(biāo)準(zhǔn)庫(kù)<assert.h>的實(shí)現(xiàn)詳解

    C標(biāo)準(zhǔn)庫(kù)<assert.h>的實(shí)現(xiàn)詳解

    這篇文章主要介紹了C標(biāo)準(zhǔn)庫(kù)<assert.h>的實(shí)現(xiàn),主要包括了<assert.h>的基本概念、實(shí)現(xiàn)及用法等,需要的朋友可以參考下
    2014-09-09
  • C++詳細(xì)講解函數(shù)調(diào)用與Struct和CLass的區(qū)別

    C++詳細(xì)講解函數(shù)調(diào)用與Struct和CLass的區(qū)別

    主調(diào)函數(shù)使用被調(diào)函數(shù)的功能,稱為函數(shù)調(diào)用。在C語(yǔ)言/C++中,只有在函數(shù)調(diào)用時(shí),函數(shù)體中定義的功能才會(huì)被執(zhí)行,下面讓我們?cè)敿?xì)來(lái)了解
    2022-05-05

最新評(píng)論

阳西县| 赞皇县| 砀山县| 镇雄县| 四川省| 宕昌县| 花垣县| 连山| 体育| 广东省| 金溪县| 保靖县| 云和县| 宜川县| 女性| 静海县| 泸定县| 缙云县| 伊宁县| 梅州市| 连云港市| 郁南县| 霍州市| 临沭县| 容城县| 木兰县| 岐山县| 睢宁县| 平舆县| 芮城县| 德令哈市| 湘乡市| 库伦旗| 得荣县| 酒泉市| 探索| 武川县| 滦平县| 武陟县| 政和县| 高邮市|