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

C++ class傳值和傳引用的詳細(xì)介紹

 更新時(shí)間:2026年04月02日 09:58:39   作者:平凡而偉大.  
在 C++ 中,class(類對象)的傳值和傳引用是兩種截然不同的參數(shù)傳遞方式,它們在性能、內(nèi)存管理和行為上有著本質(zhì)的區(qū)別,本文詳細(xì)對比了C++中對象傳值和傳引用兩種參數(shù)傳遞方式的差異,感興趣的朋友跟隨小編一起看看吧

在 C++ 中,class(類對象)的傳值傳引用是兩種截然不同的參數(shù)傳遞方式,它們在性能、內(nèi)存管理和行為上有著本質(zhì)的區(qū)別。

簡單來說:傳值是“復(fù)制一份”,傳引用是“取個(gè)別名”。

以下是詳細(xì)的對比分析:

1. 核心區(qū)別概覽

表格

特性傳值傳引用 (&)
機(jī)制創(chuàng)建對象的副本 (拷貝)對象的別名 (直接操作原對象)
修改影響函數(shù)內(nèi)修改不影響外部對象函數(shù)內(nèi)修改直接影響外部對象
性能開銷 (需調(diào)用拷貝構(gòu)造函數(shù)) (無拷貝,僅傳遞地址)
內(nèi)存占用占用雙倍內(nèi)存 (原對象+副本)幾乎不占額外內(nèi)存
安全性高 (外部數(shù)據(jù)受保護(hù))較低 (外部數(shù)據(jù)可能被意外修改)
多態(tài)性會(huì)導(dǎo)致對象切片 (丟失派生類信息)支持多態(tài) (保留完整信息)

2. 深入解析

?? 傳值

當(dāng)你按值傳遞一個(gè)類對象時(shí),C++ 會(huì)調(diào)用該類的拷貝構(gòu)造函數(shù)來創(chuàng)建一個(gè)完全獨(dú)立的副本。

  • 優(yōu)點(diǎn)
    • 數(shù)據(jù)安全:函數(shù)內(nèi)部無論怎么折騰,都不會(huì)影響原始數(shù)據(jù)。
    • 語義清晰:適合傳遞小型對象或不需要修改的場景。
  • 缺點(diǎn)
    • 性能差:如果類很大(包含大量成員變量或動(dòng)態(tài)內(nèi)存),拷貝操作非常耗時(shí)。
    • 對象切片:如果傳遞的是派生類對象給基類形參,派生類特有的部分會(huì)被“切掉”,導(dǎo)致多態(tài)失效。

?? 傳引用

傳遞引用實(shí)際上是傳遞對象的內(nèi)存地址,但在語法上看起來像直接操作變量。

  • 優(yōu)點(diǎn)
    • 高性能:沒有拷貝開銷,無論對象多大,傳遞效率都一樣高。
    • 支持多態(tài):可以傳遞派生類對象給基類引用,正確調(diào)用虛函數(shù)。
    • 修改原值:允許函數(shù)直接修改調(diào)用者的數(shù)據(jù)(如果需要的話)。
  • 缺點(diǎn)
    • 副作用風(fēng)險(xiǎn):如果不小心,可能會(huì)意外修改外部數(shù)據(jù)。

3. 代碼示例

#include <iostream>
#include <string>
#include <vector>
class Student {
public:
    std::string name;
    int age;
    Student(std::string n, int a) : name(n), age(a) {}
    // 拷貝構(gòu)造函數(shù)(用于演示傳值時(shí)的拷貝行為)
    Student(const Student& other) : name(other.name), age(other.age) {
        std::cout << "?? [拷貝構(gòu)造函數(shù)被調(diào)用]" << std::endl;
    }
};
// --- 1. 傳值 ---
// 這里的 s 是 originalStudent 的副本
void modifyByValue(Student s) {
    s.name = "Modified_Value";
    s.age = 99;
    std::cout << "函數(shù)內(nèi)(值): " << s.name << ", " << s.age << std::endl;
}
// --- 2. 傳引用 (非常用) ---
// 這里的 s 是 originalStudent 的別名
void modifyByReference(Student& s) {
    s.name = "Modified_Reference";
    s.age = 88;
    std::cout << "函數(shù)內(nèi)(引用): " << s.name << ", " << s.age << std::endl;
}
// --- 3. 常量引用 (最佳實(shí)踐) ---
// 既避免了拷貝,又防止了修改
void printStudent(const Student& s) {
    // s.name = "Error"; // 編譯錯(cuò)誤:不能修改 const 對象
    std::cout << "函數(shù)內(nèi)(只讀): " << s.name << ", " << s.age << std::endl;
}
int main() {
    Student originalStudent("Alice", 20);
    std::cout << "原始數(shù)據(jù): " << originalStudent.name << ", " << originalStudent.age << std::endl;
    std::cout << "--- 調(diào)用傳值函數(shù) ---" << std::endl;
    modifyByValue(originalStudent); 
    // originalStudent 未被修改,但觸發(fā)了拷貝構(gòu)造
    std::cout << "調(diào)用后: " << originalStudent.name << ", " << originalStudent.age << std::endl << std::endl;
    std::cout << "--- 調(diào)用傳引用函數(shù) ---" << std::endl;
    modifyByReference(originalStudent);
    // originalStudent 被修改了
    std::cout << "調(diào)用后: " << originalStudent.name << ", " << originalStudent.age << std::endl;
    return 0;
}

4. 什么時(shí)候用哪個(gè)?(最佳實(shí)踐)

在實(shí)際開發(fā)中,請遵循以下規(guī)則:

  • 首選:const 引用 (const ClassName& obj)
    • 場景:絕大多數(shù)情況。當(dāng)你只需要讀取對象數(shù)據(jù),不需要修改它時(shí)。
    • 理由:避免了昂貴的拷貝開銷,同時(shí)保證了數(shù)據(jù)安全(不會(huì)被函數(shù)修改)。
    • 例子: void printData(const std::vector<int>& data);
  • 次選:非 const 引用 (ClassName& obj)
    • 場景:當(dāng)你需要在函數(shù)內(nèi)部修改對象狀態(tài)時(shí)。
    • 理由:高效且意圖明確(調(diào)用者知道數(shù)據(jù)會(huì)被改)。
    • 例子: void updateConfig(Config& cfg);
  • 最后:傳值 (ClassName obj)
    • 場景:
    • 對象非常?。ㄈ缰话?1-2 個(gè) int 的類)。
    • 你確實(shí)需要一個(gè)副本,并且要在函數(shù)內(nèi)隨意修改而不影響原對象。
    • 注意:對于像 std::vector、std::string 或大型自定義類,永遠(yuǎn)不要按值傳遞。

?? 特別注意:對象切片

如果你使用繼承和多態(tài),千萬不要傳值。

class Animal { public: virtual void speak() { cout << "..." << endl; } };
class Dog : public Animal { public: void speak() { cout << "Woof!" << endl; } };
void makeSound(Animal a) { a.speak(); } // 錯(cuò)誤:傳值會(huì)導(dǎo)致切片,Dog 變成 Animal
void makeSound(Animal& a) { a.speak(); } // 正確:傳引用保留多態(tài)性

到此這篇關(guān)于C++ class傳值和傳引用的詳細(xì)介紹的文章就介紹到這了,更多相關(guān)C++ class傳值和傳引用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++字符數(shù)組的輸入輸出和字符串結(jié)束標(biāo)志使用講解

    C++字符數(shù)組的輸入輸出和字符串結(jié)束標(biāo)志使用講解

    這篇文章主要介紹了C++字符數(shù)組的輸入輸出和符串結(jié)束標(biāo)志使用講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • Clion配置C語言環(huán)境的步驟詳解

    Clion配置C語言環(huán)境的步驟詳解

    這篇文章主要介紹了Clion配置C語言環(huán)境的步驟詳解,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • C++實(shí)現(xiàn)狀態(tài)機(jī)的四種方法

    C++實(shí)現(xiàn)狀態(tài)機(jī)的四種方法

    本文主要介紹了狀態(tài)機(jī)實(shí)現(xiàn)的四種方法,包括Switch、stdstd::variant&std::visit、查表法和狀態(tài)模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-06-06
  • C++類實(shí)現(xiàn)通訊錄功能

    C++類實(shí)現(xiàn)通訊錄功能

    這篇文章主要為大家詳細(xì)介紹了C++類實(shí)現(xiàn)通訊錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言中隱藏結(jié)構(gòu)體的細(xì)節(jié)

    C語言中隱藏結(jié)構(gòu)體的細(xì)節(jié)

    以筆者粗淺的認(rèn)識(shí),有兩種最常用的方法,可以實(shí)現(xiàn)庫內(nèi)結(jié)構(gòu)體定義的隱藏:接口函數(shù)形參使用結(jié)構(gòu)體指針,接口函數(shù)形參使用句柄。
    2017-05-05
  • C/C++ 獲取Windows系統(tǒng)的位數(shù)32位或64位的實(shí)現(xiàn)代碼

    C/C++ 獲取Windows系統(tǒng)的位數(shù)32位或64位的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C/C++ 獲取Windows系統(tǒng)的位數(shù)32位或64位的實(shí)現(xiàn)代碼的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • matlab實(shí)現(xiàn)繪制玫瑰花球的示例代碼

    matlab實(shí)現(xiàn)繪制玫瑰花球的示例代碼

    這篇文章主要介紹了如何利用matlab實(shí)現(xiàn)繪制玫瑰花球,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2023-08-08
  • 詳解C語言如何實(shí)現(xiàn)配置文件的讀寫

    詳解C語言如何實(shí)現(xiàn)配置文件的讀寫

    這篇文章主要為大家詳細(xì)介紹了如何使用C語言實(shí)現(xiàn)配置文件的讀寫,包括定義全局宏、公用函數(shù)、比較字符串等功能,需要的可以參考一下
    2024-11-11
  • 深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對齊

    深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對齊

    要求數(shù)據(jù)內(nèi)存的起始地址的值是某個(gè)數(shù)k的倍數(shù),這就是所謂的內(nèi)存對齊,本文就來深入剖析C++中的struct結(jié)構(gòu)體字節(jié)對齊,需要的朋友可以參考下
    2016-05-05
  • C++實(shí)現(xiàn)LeetCode(42.收集雨水)

    C++實(shí)現(xiàn)LeetCode(42.收集雨水)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(42.收集雨水),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

昆山市| 广河县| 洪江市| 上犹县| 宣武区| 平泉县| 吉林省| 开封县| 田林县| 天峨县| 榕江县| 重庆市| 邢台县| 盐山县| 达日县| 新乐市| 方正县| 敦化市| 永德县| 翼城县| 繁峙县| 大安市| 丽江市| 紫云| 永丰县| 健康| 奉化市| 临沧市| 闵行区| 临漳县| 广平县| 桓台县| 临邑县| 武宣县| 宜宾市| 北辰区| 班戈县| 洪泽县| 遂平县| 定襄县| 上栗县|