亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文詳解C++中的mutable關(guān)鍵字

 更新時(shí)間:2023年10月27日 11:29:14   作者:思想覺(jué)悟  
在C++中mutable關(guān)鍵字正如字面意思所示,表示「可變的」之意,一般在以下兩種情況中使用較多,一是修飾類中的變量,用來(lái)突破const的限制,二是在Lambda表達(dá)式中使用,用來(lái)捕獲修改表達(dá)式之外的變量值,下面我們就針對(duì)這兩種使用場(chǎng)景逐個(gè)介紹

mutable修飾類的成員變量

以下實(shí)例代碼有一個(gè)類Person,內(nèi)部有一個(gè)age成員變量表示年齡,有一個(gè)被const修飾的公共方法獲取年齡:

#include <iostream>
class Person{
public:
    explicit Person(int a):age(a){

    }
    ~Person(){

    }
    int getAge() const{
        return age;
    }
private:
    int age{18};
};

int main() {
    const Person person(20);
    std::cout << "age = " << person.getAge() << std::endl;
    return 0;
}

假如我想擴(kuò)展一下這個(gè)類Person的功能,在其內(nèi)部增加一個(gè)counter的字段,用于統(tǒng)計(jì)getAge方法的調(diào)用次數(shù),于是將其代碼改成一下這樣子:

#include <iostream>
class Person{
public:
    explicit Person(int a):age(a){

    }
    ~Person(){

    }
    int getAge() const{
        counter++;
        return age;
    }
private:
    int age{18};
    int counter{0};
};

int main() {
    const Person person(20);
    std::cout << "age = " << person.getAge() << std::endl;
    return 0;
}

我們發(fā)現(xiàn)代碼無(wú)法編譯通過(guò)了,因?yàn)間etAge函數(shù)是被const修飾的,被const修飾的函數(shù),在其內(nèi)部無(wú)法修改該類的成員變量。為了可以讓代碼通過(guò)編譯并能順利運(yùn)行, 于是我們把第10行和第20行的const去掉即可。

這個(gè)解決方案可以說(shuō)是正確的,但是同時(shí)也在一定程度傻姑娘破壞了我們?cè)O(shè)計(jì)者的本意,因?yàn)槌绦蛟O(shè)計(jì)者的本意僅僅是希望counter可以被修改,而age還是不能隨意修改的, 把const刪除后age也可以隨意修改了,同時(shí)在《Effective C++》一書(shū)中作者也提到過(guò)一條準(zhǔn)則就是只要可能就用 const,明顯這個(gè)Person也是適合使用const修飾的, 那么我們?cè)鯓有薷牟拍茏龅郊仁褂胏onst保證其他變量不可隨意修改,又能保證在const函數(shù)體內(nèi)counter可以修改呢?這時(shí)候mutable的關(guān)鍵字的作用就體現(xiàn)出來(lái)了。

我們僅僅需要在聲明counter變量時(shí)使用mutable修飾一下即可,也就是:

class Person{
public:
    explicit Person(int a):age(a){

    }
    ~Person(){

    }
    int getAge() const{
        counter++;
        return age;
    }
private:
    int age{18};
    mutable int counter{0};
};

同理,如果我們希望在被const修飾的函數(shù)getAge內(nèi)age變量也可被修改的話,也可以使用mutable修飾age變量。

mutable在Lambda表達(dá)式中的作用

C++11標(biāo)準(zhǔn)中引入了 Lambda 表達(dá)式,用于定義匿名函數(shù),使得代碼更加靈活簡(jiǎn)潔。

我們簡(jiǎn)單回顧一下Lambda表達(dá)式的語(yǔ)法,Lambda表達(dá)式的語(yǔ)法主要分為五個(gè)部分,對(duì)應(yīng)為:

[捕獲列表] (函數(shù)參數(shù)) mutable 或 exception 聲明 -> 返回值類型 {函數(shù)體}

其中 mutable 或 exception 聲明以及返回值類型是可以忽略不寫的。

捕獲列表的值又可以有以下幾種形式:

包括下面幾種形式:

  • [] 表示不捕獲任何變量
  • [=] 表示按值傳遞的方法捕獲父作用域的所有變量
  • [&] 表示按引用傳遞的方法捕獲父作用域的所有變量
  • [=, &a] 表示按值傳遞的方法捕獲父作用域的所有變量,但按引用傳遞的方法捕獲變量a
  • [&, a] 表示按引用傳遞的方法捕獲父作用域的所有變量,但按值傳遞的方法捕獲變量a

其中按值捕獲[=]的方式不允許程序員在 Lambda 函數(shù)的函數(shù)體中修改捕獲的變量。而以 mutable 修飾 Lambda 函數(shù),則可以打破這種限制。

例如一下代碼是無(wú)法編譯通過(guò)的:

#include <iostream>
int main() {
    int x{0} ;
    auto f1 = [=]() {return ++x;};
    f1();
    std::cout << "x = " << x << std::endl;
    return 0;
}

因?yàn)長(zhǎng)ambda表達(dá)式f1,在內(nèi)部修改了表達(dá)式外部x的值,但是又沒(méi)有使用mutable關(guān)鍵字聲明,此時(shí)我們只需要使用mutable關(guān)鍵字聲明一下f1即可:

#include <iostream>
int main() {
    int x{0} ;
    auto f1 = [=]() mutable {return ++x;};
    f1();
    std::cout << "x = " << x << std::endl;
    return 0;
}

在這里考考大家一個(gè)簡(jiǎn)單的問(wèn)題,為什么在f1內(nèi)部改變了外部x的值,但是打印x的值還是0呢?為何沒(méi)有生效呢?

針對(duì)以上例子如果想要在表達(dá)式外部修改x的值,筆者覺(jué)得直接在捕獲列表中使用引用傳遞不是更加方便明了嗎,mutable關(guān)鍵字在Lambda表達(dá)式中是否有點(diǎn)脫褲子放屁的感覺(jué)?

以上就是一文詳解C++中的mutable關(guān)鍵字的詳細(xì)內(nèi)容,更多關(guān)于C++ mutable關(guān)鍵字的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言程序環(huán)境和預(yù)處理詳解分析

    C語(yǔ)言程序環(huán)境和預(yù)處理詳解分析

    大家有沒(méi)有想過(guò),在vs2019的編譯器上只要按下Ctrl+F5,一個(gè)test.c的源程序就能變成一個(gè).exe的可執(zhí)行程序,這其中是如何通過(guò)編譯產(chǎn)生的呢,本章就和大家一起把其中的知識(shí)和重點(diǎn)的預(yù)處理一起學(xué)習(xí)一下
    2022-03-03
  • 用C語(yǔ)言實(shí)現(xiàn)排雷游戲

    用C語(yǔ)言實(shí)現(xiàn)排雷游戲

    大家好,本篇文章主要講的是用C語(yǔ)言實(shí)現(xiàn)排雷游戲,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • c文件匯編后函數(shù)參數(shù)傳遞的不同之處

    c文件匯編后函數(shù)參數(shù)傳遞的不同之處

    在w7 32位系統(tǒng)下把c文件匯編后,確實(shí)與mac后的差異很大。可不僅僅是寄存器eax與rax的區(qū)別。我想說(shuō)的是函數(shù)參數(shù)傳遞的不同
    2013-11-11
  • 詳解C++ string字符串類

    詳解C++ string字符串類

    這篇文章主要介紹了C++ string字符串類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C語(yǔ)言模擬實(shí)現(xiàn)C++的繼承與多態(tài)示例

    C語(yǔ)言模擬實(shí)現(xiàn)C++的繼承與多態(tài)示例

    本篇文章主要介紹了C語(yǔ)言模擬實(shí)現(xiàn)C++的繼承與多態(tài)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 深入C++實(shí)現(xiàn)函數(shù)itoa()的分析

    深入C++實(shí)現(xiàn)函數(shù)itoa()的分析

    本篇文章是對(duì)C++實(shí)現(xiàn)函數(shù)itoa()進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 學(xué)好C++必須做到的50條 絕對(duì)經(jīng)典!

    學(xué)好C++必須做到的50條 絕對(duì)經(jīng)典!

    學(xué)好C++必須做到的50條,絕對(duì)經(jīng)典!想要學(xué)好C++的朋友一定要認(rèn)真閱讀本文,更要做到以下50條
    2016-09-09
  • 深入理解C++移位運(yùn)算符

    深入理解C++移位運(yùn)算符

    下面小編就為大家?guī)?lái)一篇深入理解C++移位運(yùn)算符。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • C++撲克牌的洗牌發(fā)牌游戲設(shè)計(jì)

    C++撲克牌的洗牌發(fā)牌游戲設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++撲克牌的洗牌發(fā)牌游戲設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 淺談c和c++的某些小區(qū)別

    淺談c和c++的某些小區(qū)別

    下面小編就為大家?guī)?lái)一篇淺談c和c++的某些小區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06

最新評(píng)論