欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 參數(shù)傳遞方式全解析(多種方式)

 更新時(shí)間:2025年09月20日 14:27:36   作者:沒(méi)有天賦那就反復(fù)  
C++支持值、指針、引用、const引用、移動(dòng)語(yǔ)義等參數(shù)傳遞方式,值傳遞適用于小型數(shù)據(jù),引用/const引用用于大型對(duì)象或只讀訪問(wèn),移動(dòng)語(yǔ)義優(yōu)化資源管理,數(shù)組需傳遞大小,本文給大家介紹C++ 參數(shù)傳遞方式,感興趣的朋友一起看看吧

C++ 提供了多種參數(shù)傳遞方式,每種方式都有其特定的用途和性能特征。下面我將詳細(xì)解釋各種傳遞方式,并通過(guò)示例代碼進(jìn)行演示。

1. 值傳遞 (Pass by Value)

值傳遞會(huì)創(chuàng)建參數(shù)的完整副本,函數(shù)內(nèi)對(duì)參數(shù)的修改不會(huì)影響原始變量。

#include <iostream>
using namespace std;
void modifyValue(int x) {
    x = x + 10;  // 修改的是副本,不影響原始值
    cout << "函數(shù)內(nèi)值: " << x << endl;
}
int main() {
    int a = 5;
    cout << "調(diào)用前: " << a << endl;
    modifyValue(a);
    cout << "調(diào)用后: " << a << endl;  // 仍然是5
    return 0;
}

特點(diǎn)

  • 創(chuàng)建參數(shù)的完整副本
  • 函數(shù)內(nèi)修改不影響原始值
  • 適用于小型數(shù)據(jù)類型(int, float, char等)
  • 對(duì)于大型對(duì)象,復(fù)制開(kāi)銷較大

2. 指針傳遞 (Pass by Pointer)

指針傳遞傳遞的是變量的內(nèi)存地址,函數(shù)內(nèi)可以通過(guò)指針修改原始值。

#include <iostream>
using namespace std;
void modifyPointer(int* x) {
    *x = *x + 10;  // 通過(guò)指針修改原始值
    cout << "函數(shù)內(nèi)指針值: " << *x << endl;
}
int main() {
    int a = 5;
    cout << "調(diào)用前: " << a << endl;
    modifyPointer(&a);  // 傳遞地址
    cout << "調(diào)用后: " << a << endl;  // 變?yōu)?5
    return 0;
}

特點(diǎn)

  • 傳遞內(nèi)存地址
  • 函數(shù)內(nèi)修改會(huì)影響原始值
  • 可以傳遞nullptr
  • 需要解引用操作(*)
  • 語(yǔ)法相對(duì)復(fù)雜,可能產(chǎn)生空指針問(wèn)題

3. 引用傳遞 (Pass by Reference)

引用傳遞傳遞的是變量的別名,函數(shù)內(nèi)對(duì)引用的修改會(huì)影響原始值。

#include <iostream>
using namespace std;
void modifyReference(int& x) {
    x = x + 10;  // 修改引用即修改原始值
    cout << "函數(shù)內(nèi)引用值: " << x << endl;
}
int main() {
    int a = 5;
    cout << "調(diào)用前: " << a << endl;
    modifyReference(a);  // 直接傳遞變量
    cout << "調(diào)用后: " << a << endl;  // 變?yōu)?5
    return 0;
}

特點(diǎn)

  • 傳遞變量的別名
  • 函數(shù)內(nèi)修改會(huì)影響原始值
  • 語(yǔ)法簡(jiǎn)潔,無(wú)需解引用
  • 比指針更安全(不能為null)
  • 是C++中推薦的修改參數(shù)的方式

4. const引用傳遞 (Pass by const Reference)

const引用傳遞可以避免大型對(duì)象的復(fù)制開(kāi)銷,同時(shí)保護(hù)原始數(shù)據(jù)不被修改。

#include <iostream>
#include <string>
using namespace std;
void printString(const string& s) {
    cout << "字符串內(nèi)容: " << s << endl;
    // s += " modified"; // 錯(cuò)誤:不能修改const引用
}
int main() {
    string str = "這是一個(gè)很長(zhǎng)的字符串,使用值傳遞會(huì)產(chǎn)生復(fù)制開(kāi)銷";
    printString(str);  // 避免復(fù)制,同時(shí)保護(hù)原始數(shù)據(jù)
    cout << "原始字符串未改變: " << str << endl;
    return 0;
}

特點(diǎn)

  • 避免大型對(duì)象的復(fù)制開(kāi)銷
  • 保護(hù)原始數(shù)據(jù)不被修改
  • 適用于大型對(duì)象(字符串、容器、自定義對(duì)象等)
  • 是C++中傳遞大型對(duì)象的推薦方式

5. 移動(dòng)語(yǔ)義傳遞 (C++11)

移動(dòng)語(yǔ)義傳遞通過(guò)轉(zhuǎn)移資源所有權(quán)來(lái)避免不必要的復(fù)制,特別適用于管理資源的對(duì)象。

#include <iostream>
#include <vector>
#include <utility>  // for std::move
using namespace std;
void processVector(vector<int>&& v) {
    cout << "移動(dòng)傳遞 - 向量大小: " << v.size() << endl;
    // 可以修改v,但原始向量將變?yōu)榭?
    v.push_back(99);
    cout << "修改后大小: " << v.size() << endl;
}
int main() {
    vector<int> vec = {1, 2, 3, 4, 5};
    cout << "移動(dòng)前向量大小: " << vec.size() << endl;
    processVector(move(vec));  // 顯式轉(zhuǎn)移所有權(quán)
    cout << "移動(dòng)后向量大小: " << vec.size() << endl;  // 變?yōu)?
    return 0;
}

特點(diǎn)

  • 轉(zhuǎn)移資源所有權(quán),避免復(fù)制
  • 使用std::move()顯式轉(zhuǎn)移
  • 適用于可移動(dòng)對(duì)象(vector, string, 自定義移動(dòng)語(yǔ)義的對(duì)象)
  • 原始對(duì)象將處于有效但未定義的狀態(tài)

6. 數(shù)組傳遞

C++中數(shù)組傳遞實(shí)際上是指針傳遞,需要額外傳遞數(shù)組大小信息。

#include <iostream>
using namespace std;
void printArray(int arr[], int size) {
    cout << "數(shù)組元素: ";
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
        arr[i] += 1;  // 修改會(huì)影響原始數(shù)組
    }
    cout << endl;
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    cout << "調(diào)用前第一個(gè)元素: " << arr[0] << endl;
    printArray(arr, size);
    cout << "調(diào)用后第一個(gè)元素: " << arr[0] << endl;  // 變?yōu)?
    return 0;
}

特點(diǎn)

  • 實(shí)際上傳遞的是指向數(shù)組首元素的指針
  • 需要額外傳遞數(shù)組大小信息
  • 函數(shù)內(nèi)修改會(huì)影響原始數(shù)組
  • 可以使用std::array或std::vector替代原始數(shù)組

7. 默認(rèn)參數(shù)

函數(shù)可以指定默認(rèn)參數(shù),調(diào)用時(shí)可以省略這些參數(shù)。

#include <iostream>
using namespace std;
// 默認(rèn)參數(shù)必須在函數(shù)聲明中指定
void printMessage(string message = "Hello, World!", int times = 1) {
    for (int i = 0; i < times; i++) {
        cout << message << endl;
    }
}
int main() {
    printMessage();  // 使用所有默認(rèn)參數(shù)
    printMessage("Hi!");  // 使用默認(rèn)times
    printMessage("C++ is great!", 3);  // 不使用默認(rèn)參數(shù)
    return 0;
}

特點(diǎn)

  • 允許函數(shù)調(diào)用時(shí)省略某些參數(shù)
  • 默認(rèn)值必須在函數(shù)聲明中指定
  • 默認(rèn)參數(shù)必須從右向左連續(xù)設(shè)置

8. 可變參數(shù)模板 (C++11)

可變參數(shù)模板允許函數(shù)接受任意數(shù)量和類型的參數(shù)。

#include <iostream>
using namespace std;
// 基礎(chǔ)案例 - 遞歸終止函數(shù)
void print() {
    cout << endl;
}
// 可變參數(shù)模板
template<typename T, typename... Args>
void print(T first, Args... args) {
    cout << first << " ";
    print(args...);  // 遞歸調(diào)用
}
int main() {
    print(1, 2.5, "hello", 'a');  // 輸出: 1 2.5 hello a 
    return 0;
}

特點(diǎn)

  • 接受任意數(shù)量和類型的參數(shù)
  • 提供類型安全的可變參數(shù)處理
  • 使用遞歸模板展開(kāi)參數(shù)包
  • C++11及以上版本支持

9. 函數(shù)對(duì)象傳遞

C++中函數(shù)也可以作為參數(shù)傳遞,通常通過(guò)函數(shù)指針、std::function或lambda表達(dá)式實(shí)現(xiàn)。

#include <iostream>
#include <functional>
using namespace std;
// 使用函數(shù)指針
void process(int x, int y, int (*func)(int, int)) {
    cout << "結(jié)果: " << func(x, y) << endl;
}
// 使用std::function(更靈活)
void processFunction(int x, int y, function<int(int, int)> func) {
    cout << "結(jié)果: " << func(x, y) << endl;
}
int add(int a, int b) {
    return a + b;
}
int multiply(int a, int b) {
    return a * b;
}
int main() {
    // 函數(shù)指針傳遞
    process(5, 3, add);
    process(5, 3, multiply);
    // std::function傳遞
    processFunction(5, 3, add);
    // Lambda表達(dá)式傳遞
    processFunction(5, 3, [](int a, int b) { return a - b; });
    return 0;
}

總結(jié)與選擇指南

傳遞方式適用場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)
值傳遞小型數(shù)據(jù)類型簡(jiǎn)單安全,不影響原始值復(fù)制開(kāi)銷大(大型對(duì)象)
指針傳遞需要修改原始值,可選參數(shù)可以修改原始值,可以傳遞null語(yǔ)法復(fù)雜,可能空指針異常
引用傳遞需要修改原始值語(yǔ)法簡(jiǎn)潔,比指針安全不能傳遞null
const引用大型對(duì)象,只讀訪問(wèn)避免復(fù)制,保護(hù)原始數(shù)據(jù)不能修改參數(shù)
移動(dòng)語(yǔ)義資源管理對(duì)象避免復(fù)制,轉(zhuǎn)移所有權(quán)原始對(duì)象狀態(tài)未定義
數(shù)組傳遞C風(fēng)格數(shù)組直接操作數(shù)組元素需要額外傳遞大小信息
默認(rèn)參數(shù)簡(jiǎn)化函數(shù)調(diào)用調(diào)用靈活必須從右向左設(shè)置
可變參數(shù)參數(shù)數(shù)量不定高度靈活,類型安全實(shí)現(xiàn)復(fù)雜

一般建議

  1. 對(duì)于基本數(shù)據(jù)類型,使用值傳遞
  2. 需要修改參數(shù)時(shí),使用引用傳遞
  3. 對(duì)于大型對(duì)象,使用const引用傳遞
  4. 需要轉(zhuǎn)移資源所有權(quán)時(shí),使用移動(dòng)語(yǔ)義
  5. 避免使用原始指針傳遞,優(yōu)先使用引用或智能指針

這些傳遞方式可以根據(jù)實(shí)際需求組合使用,以滿足不同的編程場(chǎng)景。

到此這篇關(guān)于C++ 參數(shù)傳遞方式全解析(多種方式)的文章就介紹到這了,更多相關(guān)C++ 參數(shù)傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++筆記-設(shè)置cout輸出數(shù)據(jù)的寬度和填充方式

    C++筆記-設(shè)置cout輸出數(shù)據(jù)的寬度和填充方式

    這篇文章主要介紹了C++筆記-設(shè)置cout輸出數(shù)據(jù)的寬度和填充方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C/C++獲取目錄下的文件列表信息

    C/C++獲取目錄下的文件列表信息

    在C/C++編程時(shí),需要獲取目錄下面的文件列表信息,下面把代碼分享一下
    2014-02-02
  • 用C語(yǔ)言實(shí)現(xiàn)計(jì)算器功能

    用C語(yǔ)言實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++用easyx圖形庫(kù)實(shí)現(xiàn)障礙跑酷小游戲

    C++用easyx圖形庫(kù)實(shí)現(xiàn)障礙跑酷小游戲

    這篇文章主要為大家詳細(xì)介紹了C++用easyx圖形庫(kù)實(shí)現(xiàn)障礙跑酷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++使用MFC獲取PC硬件配置信息

    C++使用MFC獲取PC硬件配置信息

    這篇文章主要為大家詳細(xì)介紹了C++使用MFC獲取PC硬件配置信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • C++ Boost log日志庫(kù)超詳細(xì)講解

    C++ Boost log日志庫(kù)超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • VC++創(chuàng)建msi文件的方法

    VC++創(chuàng)建msi文件的方法

    這篇文章主要介紹了VC++創(chuàng)建msi文件的方法,對(duì)于應(yīng)用程序的開(kāi)發(fā)有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-07-07
  • c++函數(shù)名指針和函數(shù)指針

    c++函數(shù)名指針和函數(shù)指針

    這篇文章主要介紹了c++函數(shù)名指針和函數(shù)指針,函數(shù)指針和數(shù)據(jù)類似,C++當(dāng)中函數(shù)也有地址,函數(shù)的地址是存儲(chǔ)函數(shù)機(jī)器語(yǔ)言代碼的內(nèi)存地址。我們可以將另外一個(gè)函數(shù)的地址作為參數(shù)傳入函數(shù),從而實(shí)現(xiàn)函數(shù)的靈活調(diào)用,下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-02-02
  • C++?STL-string類底層實(shí)現(xiàn)過(guò)程

    C++?STL-string類底層實(shí)現(xiàn)過(guò)程

    本文實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的string類,涵蓋動(dòng)態(tài)數(shù)組存儲(chǔ)、深拷貝機(jī)制、迭代器支持、容量調(diào)整、字符串修改、運(yùn)算符重載等功能,模擬標(biāo)準(zhǔn)string核心特性,重點(diǎn)強(qiáng)調(diào)了內(nèi)存管理與邊界檢查
    2025-08-08
  • c/c++中變量的聲明和定義深入解析

    c/c++中變量的聲明和定義深入解析

    “聲明”為編譯服務(wù),用于類型檢查 ;“定義”在運(yùn)行時(shí)會(huì)分配空間,不能重復(fù)定義,同時(shí)具備聲明的功能
    2013-09-09

最新評(píng)論