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

c++中ref的作用示例解析

 更新時間:2023年04月23日 14:52:22   作者:澤林阿  
這篇文章主要為大家介紹了c++中ref的作用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

C++11 中引入 std::ref 用于取某個變量的引用,這個引入是為了解決一些傳參問題。

我們知道 C++ 中本來就有引用的存在,為何 C++11 中還要引入一個 std::ref 了?主要是考慮函數(shù)式編程(如 std::bind)在使用時,是對參數(shù)直接拷貝,而不是引用。下面通過例子說明

示例1:

#include <functional>
#include <iostream>
void f(int& n1, int& n2, const int& n3)
{
    std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
    ++n1; // increments the copy of n1 stored in the function object
    ++n2; // increments the main()'s n2
    // ++n3; // compile error
}

int main()
{
    int n1 = 1, n2 = 2, n3 = 3;
    std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
    n1 = 10;
    n2 = 11;
    n3 = 12;
    std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
    bound_f();
    std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
}

輸出:

Before function: 10 11 12
In function: 1 11 12
After function: 10 12 12

上述代碼在執(zhí)行 std::bind 后,在函數(shù) f() 中n1 的值仍然是 1,n2 和 n3 改成了修改的值,說明 std::bind 使用的是參數(shù)的拷貝而不是引用,因此必須顯示利用 std::ref 來進(jìn)行引用綁定。具體為什么 std::bind 不使用引用,可能確實(shí)有一些需求,使得 C++11 的設(shè)計者認(rèn)為默認(rèn)應(yīng)該采用拷貝,如果使用者有需求,加上 std::ref 即可。

#include <thread>
#include <iostream>
#include <string>
void threadFunc(std::string &str, int a)
{
    str = "change by threadFunc";
    a = 13;
}

int main()
{
    std::string str("main");
    int a = 9;
    std::thread th(threadFunc, std::ref(str), a);

    th.join();

    std::cout<<"str = " << str << std::endl;
    std::cout<<"a = " << a << std::endl;

    return 0;
}

該程序創(chuàng)建一個線程 th,調(diào)用帶有兩個參數(shù)的 threadFunc 函數(shù):一個是 std::string 對象 str 的引用,另一個是整數(shù) a。函數(shù) threadFunc 修改字符串 str 為 "change by threadFunc",但不修改整數(shù) a。最后在主線程中輸出 stra 的值。

輸出:

str = change by threadFunc
a = 9

可以看到,和 std::bind 類似,多線程的 std::thread 也是必須顯式通過 std::ref 來綁定引用進(jìn)行傳參,否則,形參的引用聲明是無效的。

總結(jié)

std::ref 是一個 C++ 標(biāo)準(zhǔn)庫函數(shù)模板,它將對象的引用轉(zhuǎn)換為可復(fù)制的可調(diào)用對象。

std::ref 用于將對象的引用傳遞給函數(shù)或線程等可調(diào)用對象的參數(shù)。如果不使用 std::ref,那么函數(shù)或線程會將對象的副本傳遞給可調(diào)用對象的參數(shù),這可能會導(dǎo)致無法預(yù)期的結(jié)果,因?yàn)閷υ摳北镜男薷牟粫绊懺紝ο?。通過使用 std::ref,可以確??烧{(diào)用對象引用的是原始對象,因此對該對象的修改將影響原始對象。

需要注意的是,使用 std::ref 前必須確保原始對象的生命周期至少與可調(diào)用對象相同,否則會導(dǎo)致懸空引用。另外,std::ref 不能用于將指向臨時對象或?qū)⑦^時對象的引用傳遞給可調(diào)用對象。

總之,std::ref 的作用是將對象的引用轉(zhuǎn)換為可復(fù)制的可調(diào)用對象,使得在函數(shù)或線程等可調(diào)用對象中引用原始對象,而不是其副本。

以上就是c++中ref的作用示例解析的詳細(xì)內(nèi)容,更多關(guān)于c++ ref作用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C/C++經(jīng)典實(shí)例之模擬計算器示例代碼

    C/C++經(jīng)典實(shí)例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實(shí)例之模擬計算器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • C++數(shù)據(jù)結(jié)構(gòu)AVL樹全面分析

    C++數(shù)據(jù)結(jié)構(gòu)AVL樹全面分析

    今天的這一篇博客,我要跟大家介紹一顆樹——AVL樹,它也是一顆二叉搜索樹,它就是在二叉搜索樹中加了一個平衡因子的概念在里面,下面我就來和大家聊一聊這棵樹是個怎么樣的樹
    2021-10-10
  • C語言實(shí)現(xiàn)將字符串轉(zhuǎn)換成整數(shù)

    C語言實(shí)現(xiàn)將字符串轉(zhuǎn)換成整數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何用C語言寫一個函數(shù),把字符串轉(zhuǎn)換成整數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • C語言?指針數(shù)組進(jìn)階詳解

    C語言?指針數(shù)組進(jìn)階詳解

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-02-02
  • C++的STL中accumulate函數(shù)的使用方法

    C++的STL中accumulate函數(shù)的使用方法

    這篇文章主要介紹了C++的STL中accumulate的使用方法,accumulate作用是累加求和即自定義類型數(shù)據(jù)處理,下文具體的操作方法需要的小伙伴可以參考一下
    2022-03-03
  • C語言版簡單掃雷游戲

    C語言版簡單掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言版簡單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++中cin的用法詳細(xì)

    C++中cin的用法詳細(xì)

    這篇文章主要介紹了C++中cin的用法詳細(xì),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C語言實(shí)現(xiàn)拼圖小游戲

    C語言實(shí)現(xiàn)拼圖小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++設(shè)計模式之外觀模式(Facade)

    C++設(shè)計模式之外觀模式(Facade)

    這篇文章主要為大家詳細(xì)介紹了C++設(shè)計模式之外觀模式(Facade),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C++人工模擬棧實(shí)現(xiàn)方法

    C++人工模擬棧實(shí)現(xiàn)方法

    在本篇內(nèi)容里小編為大家整理了關(guān)于C++人工模擬棧實(shí)現(xiàn)方法和步驟,需要的朋友們可以學(xué)習(xí)下。
    2018-12-12

最新評論

晋城| 桃园县| 保德县| 宁乡县| 平陆县| 米易县| 雷州市| 伊宁市| 怀柔区| 郎溪县| 环江| 益阳市| 科技| 三门县| 揭东县| 葵青区| 滁州市| 崇义县| 荆门市| 双峰县| 高雄市| 乌拉特前旗| 都匀市| 闵行区| 黄山市| 铅山县| 德昌县| 馆陶县| 朝阳县| 辽中县| 蛟河市| 通州市| 龙游县| 山东省| 扬中市| 扎赉特旗| 怀集县| 镇安县| 玛曲县| 阿拉善左旗| 武山县|