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

一文詳解C++中的mutable關鍵字

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

mutable修飾類的成員變量

以下實例代碼有一個類Person,內(nèi)部有一個age成員變量表示年齡,有一個被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;
}

假如我想擴展一下這個類Person的功能,在其內(nèi)部增加一個counter的字段,用于統(tǒng)計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)代碼無法編譯通過了,因為getAge函數(shù)是被const修飾的,被const修飾的函數(shù),在其內(nèi)部無法修改該類的成員變量。為了可以讓代碼通過編譯并能順利運行, 于是我們把第10行和第20行的const去掉即可。

這個解決方案可以說是正確的,但是同時也在一定程度傻姑娘破壞了我們設計者的本意,因為程序設計者的本意僅僅是希望counter可以被修改,而age還是不能隨意修改的, 把const刪除后age也可以隨意修改了,同時在《Effective C++》一書中作者也提到過一條準則就是只要可能就用 const,明顯這個Person也是適合使用const修飾的, 那么我們怎樣修改才能做到既使用const保證其他變量不可隨意修改,又能保證在const函數(shù)體內(nèi)counter可以修改呢?這時候mutable的關鍵字的作用就體現(xiàn)出來了。

我們僅僅需要在聲明counter變量時使用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表達式中的作用

C++11標準中引入了 Lambda 表達式,用于定義匿名函數(shù),使得代碼更加靈活簡潔。

我們簡單回顧一下Lambda表達式的語法,Lambda表達式的語法主要分為五個部分,對應為:

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

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

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

包括下面幾種形式:

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

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

例如一下代碼是無法編譯通過的:

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

因為Lambda表達式f1,在內(nèi)部修改了表達式外部x的值,但是又沒有使用mutable關鍵字聲明,此時我們只需要使用mutable關鍵字聲明一下f1即可:

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

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

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

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

相關文章

  • C++之如何設置字體顏色

    C++之如何設置字體顏色

    很多C++的初學者發(fā)現(xiàn),控制臺的顏色永遠是黑白的,這未免太單調(diào)了,怎么才能使字體像那些軟件一樣呈彩色呢?現(xiàn)在,我們就將學習C++ 設置字體顏色的方法
    2023-08-08
  • Java C++題解leetcode856括號的分數(shù)

    Java C++題解leetcode856括號的分數(shù)

    這篇文章主要為大家介紹了Java C++題解leetcode856括號的分數(shù)實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • C語言實現(xiàn)BMP圖像處理(彩色圖轉灰度圖)

    C語言實現(xiàn)BMP圖像處理(彩色圖轉灰度圖)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)BMP圖像處理,彩色圖轉灰度圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C語言實現(xiàn)大數(shù)據(jù)文件的內(nèi)存映射機制

    C語言實現(xiàn)大數(shù)據(jù)文件的內(nèi)存映射機制

    這篇文章主要介紹了C語言實現(xiàn)大數(shù)據(jù)文件的內(nèi)存映射機制的相關資料,需要的朋友可以參考下
    2017-01-01
  • Qt兩種定時器使用實現(xiàn)方式

    Qt兩種定時器使用實現(xiàn)方式

    這篇文章主要給大家介紹了關于Qt兩種定時器使用實現(xiàn)方式的相關資料,Qt中的定時器類是QTimer,QTimer不是一個可見的界面組件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • c語言中main函數(shù)用法及知識點總結

    c語言中main函數(shù)用法及知識點總結

    在本篇文章里小編給大家分享的是一篇關于c語言中main函數(shù)用法及知識點總結內(nèi)容,有需要的朋友們可以跟著學習參考下。
    2021-10-10
  • QML中動態(tài)與靜態(tài)模型應用詳解

    QML中動態(tài)與靜態(tài)模型應用詳解

    QML是一種描述性的腳本語言,文件格式以.qml結尾。語法格式非常像CSS(參考后文具體例子),但又支持javascript形式的編程控制。QtDesigner可以設計出·ui界面文件,但是不支持和Qt原生C++代碼的交互
    2022-08-08
  • 實例解析C++中類的成員函數(shù)指針

    實例解析C++中類的成員函數(shù)指針

    這篇文章主要介紹了C++中類的成員函數(shù)指針,例子中以討論用函數(shù)指針調(diào)用類的成員函數(shù)為主,需要的朋友可以參考下
    2016-04-04
  • C語言字符串壓縮之ZSTD算法詳解

    C語言字符串壓縮之ZSTD算法詳解

    快速壓縮工具zstd(zstandard)是由facebook開源的快速無損壓縮算法,主要應用于zlib級別的實時壓縮場景,并且具有更好的壓縮比。本文將來講講ZSTD算法的使用,需要的可以參考一下
    2022-08-08
  • C++表達式求值詳解

    C++表達式求值詳解

    下面小編就為大家?guī)硪黄獪\談C++ 語言中的表達式求值。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10

最新評論

炉霍县| 清镇市| 亳州市| 宁城县| 德保县| 平安县| 泾源县| 柳河县| 浦城县| 德格县| 册亨县| 楚雄市| 华蓥市| 黄冈市| 沙田区| 思南县| 茂名市| 依兰县| 故城县| 察哈| 辽阳县| 洪江市| 宁安市| 达尔| 丹阳市| 巴里| 临夏市| 麻栗坡县| 新和县| 合江县| 闽侯县| 宾川县| 莱阳市| 麻江县| 康保县| 锡林浩特市| 桃园县| 延吉市| 上高县| 庆安县| 肥西县|