亚洲国产精品嫩草影院2_美丽人妻沦为公厕菜市场_99久久婷婷国产综合精品_国内揄拍自拍视频在线直播平台_免费观看在线视频一区

c++中ref的作用示例解析-環(huán)球關(guān)注

2023-04-24 05:54:47     來(lái)源 : 腳本之家
目錄
正文示例1:輸出:輸出:總結(jié)

正文

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


(資料圖)

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

示例1:

#include 
#include 
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 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,n2n3改成了修改的值,說明std::bind使用的是參數(shù)的拷貝而不是引用,因此必須顯示利用std::ref來(lái)進(jìn)行引用綁定。具體為什么std::bind不使用引用,可能確實(shí)有一些需求,使得 C++11 的設(shè)計(jì)者認(rèn)為默認(rèn)應(yīng)該采用拷貝,如果使用者有需求,加上std::ref即可。

#include 
#include 
#include 
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)建一個(gè)線程 th,調(diào)用帶有兩個(gè)參數(shù)的 threadFunc函數(shù):一個(gè)是 std::string對(duì)象 str的引用,另一個(gè)是整數(shù) a。函數(shù) threadFunc修改字符串 str為 "change by threadFunc",但不修改整數(shù) a。最后在主線程中輸出 stra的值。

輸出:

str = change by threadFunc
a = 9

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

總結(jié)

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

std::ref用于將對(duì)象的引用傳遞給函數(shù)或線程等可調(diào)用對(duì)象的參數(shù)。如果不使用 std::ref,那么函數(shù)或線程會(huì)將對(duì)象的副本傳遞給可調(diào)用對(duì)象的參數(shù),這可能會(huì)導(dǎo)致無(wú)法預(yù)期的結(jié)果,因?yàn)閷?duì)該副本的修改不會(huì)影響原始對(duì)象。通過使用 std::ref,可以確??烧{(diào)用對(duì)象引用的是原始對(duì)象,因此對(duì)該對(duì)象的修改將影響原始對(duì)象。

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

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

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

標(biāo)簽:

推薦文章

X 關(guān)閉

最新資訊

X 關(guān)閉