AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

C++中的mutable關鍵字

來源: 責編: 時間:2023-11-20 17:12:37 348觀看
導讀在C++中mutable關鍵字正如字面意思所示,表示「可變的」之意。一般在以下兩種情況中使用較多,一是修飾類中的變量,用來突破const的限制,二是在Lambda表達式中使用,用來捕獲修改表達式之外的變量值。下面我們就針對這兩種使

在C++中mutable關鍵字正如字面意思所示,表示「可變的」之意。一般在以下兩種情況中使用較多,一是修飾類中的變量,用來突破const的限制,二是在Lambda表達式中使用,用來捕獲修改表達式之外的變量值。ZCI28資訊網——每日最新資訊28at.com

下面我們就針對這兩種使用場景逐個介紹。ZCI28資訊網——每日最新資訊28at.com

ZCI28資訊網——每日最新資訊28at.com

mutable修飾類的成員變量

以下實例代碼有一個類Person,內部有一個age成員變量表示年齡,有一個被const修飾的公共方法獲取年齡:ZCI28資訊網——每日最新資訊28at.com

#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的功能,在其內部增加一個counter的字段,用于統計getAge方法的調用次數,于是將其代碼改成一下這樣子:ZCI28資訊網——每日最新資訊28at.com

#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;}

我們發現代碼無法編譯通過了,因為getAge函數是被const修飾的,被const修飾的函數,在其內部無法修改該類的成員變量。為了可以讓代碼通過編譯并能順利運行, 于是我們把第10行和第20行的const去掉即可。ZCI28資訊網——每日最新資訊28at.com

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

我們僅僅需要在聲明counter變量時使用mutable修飾一下即可,也就是:ZCI28資訊網——每日最新資訊28at.com

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修飾的函數getAge內age變量也可被修改的話,也可以使用mutable修飾age變量。ZCI28資訊網——每日最新資訊28at.com

mutable在Lambda表達式中的作用

C++11標準中引入了 Lambda 表達式,用于定義匿名函數,使得代碼更加靈活簡潔。ZCI28資訊網——每日最新資訊28at.com

我們簡單回顧一下Lambda表達式的語法,Lambda表達式的語法主要分為五個部分,對應為:ZCI28資訊網——每日最新資訊28at.com

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

其中 mutable 或 exception 聲明以及返回值類型是可以忽略不寫的。ZCI28資訊網——每日最新資訊28at.com

捕獲列表的值又可以有以下幾種形式:ZCI28資訊網——每日最新資訊28at.com

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

其中按值捕獲[=]的方式不允許程序員在 Lambda 函數的函數體中修改捕獲的變量。而以 mutable 修飾 Lambda 函數,則可以打破這種限制。ZCI28資訊網——每日最新資訊28at.com

例如一下代碼是無法編譯通過的:ZCI28資訊網——每日最新資訊28at.com

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

因為Lambda表達式f1,在內部修改了表達式外部x的值,但是又沒有使用mutable關鍵字聲明,此時我們只需要使用mutable關鍵字聲明一下f1即可:ZCI28資訊網——每日最新資訊28at.com

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

在這里考考大家一個簡單的問題,為什么在f1內部改變了外部x的值,但是打印x的值還是0呢?為何沒有生效呢?ZCI28資訊網——每日最新資訊28at.com

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

本文鏈接:http://www.tebozhan.com/showinfo-26-31554-0.htmlC++中的mutable關鍵字

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Istio Egress 出口網關使用

下一篇: 家庭影音行業迎來新的重量級選手:多珀 doopoo X3

標簽:
  • 熱門焦點
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現已正式出爐,冠軍是來自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 把LangChain跑起來的三個方法

    使用LangChain開發LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數據的地方,是數據源的一種,比如大家經常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數據,它既可以保
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 雅柏威士忌多款單品價格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業觀察編 | 肖海林今年以來,威士忌市場開始出現了降溫跡象,越來越多不斷暴漲的網紅威士忌也開始悄然回歸市場理性。近日,LVMH集團旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 東方甄選單飛:有些鳥注定是關不住的

    文/彭寬鴻編輯/羅卿東方甄選創始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一年多時間里,東方甄選要脫離抖音自立門戶的傳聞不絕于耳,&ldquo;7
  • iQOO Neo8系列今日官宣:首發天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯發科新一代旗艦芯片天璣9200+的發布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發搭載這款當前性能最強大的移動平臺
  • 榮耀Magicbook V 14 2021曙光藍版本正式開售,擁有觸摸屏

    榮耀 Magicbook V 14 2021 曙光藍版本正式開售,搭載 i7-11390H 處理器與 MX450 顯卡,配備 16GB 內存與 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 鍵盤鍵程、
Top