成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++中的mutable關鍵字

開發 前端
在C++中mutable關鍵字正如字面意思所示,表示「可變的」之意。一般在以下兩種情況中使用較多。

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

下面我們就針對這兩種使用場景逐個介紹。

mutable修飾類的成員變量

以下實例代碼有一個類Person,內部有一個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的功能,在其內部增加一個counter的字段,用于統計getAge方法的調用次數,于是將其代碼改成一下這樣子:

#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去掉即可。

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

我們僅僅需要在聲明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修飾的函數getAge內age變量也可被修改的話,也可以使用mutable修飾age變量。

mutable在Lambda表達式中的作用

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

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

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

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

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

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

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

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

#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即可:

#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呢?為何沒有生效呢?

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

責任編輯:趙寧寧 來源: 思想覺悟
相關推薦

2010-01-26 14:35:11

C++關鍵字

2024-02-23 18:04:37

C++const關鍵字

2011-07-14 23:14:42

C++static

2011-04-21 16:57:56

staticextern

2024-04-08 11:35:34

C++static關鍵字

2024-01-25 11:36:08

C++構造函數關鍵字

2023-10-04 00:04:00

C++extern

2024-01-15 10:41:31

C++關鍵字開發

2011-06-14 13:26:27

volatile

2010-02-05 15:51:06

C++ explici

2010-02-01 14:46:53

C++關鍵字

2011-04-11 15:06:22

C++關鍵字

2024-03-15 11:52:03

C++關鍵字編程

2010-02-02 14:27:54

C++ static關

2024-03-21 06:13:41

NULLC++關鍵字

2024-08-16 09:06:03

2024-08-06 16:28:57

2010-02-02 15:12:09

C++ explici

2010-02-06 10:09:47

C++模擬event關

2024-02-26 10:36:59

C++開發關鍵字
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人福利在线 | 国产精品www | 国产成人高清视频 | 成人性视频免费网站 | 毛片区| 亚洲国产区| 国产视频一二三区 | 成人精品免费视频 | 夜夜操天天干 | 亚洲高清视频一区二区 | 天天操综合网 | 99在线播放 | 日韩中文字幕在线视频 | 国产一区二区三区四区 | 精品国产乱码久久久久久蜜退臀 | 韩日一区二区三区 | 亚洲在线免费 | 久久男人天堂 | 亚洲人人舔人人 | 日本福利视频免费观看 | 青青久久久 | 欧美日韩最新 | 亚洲乱码一区二区三区在线观看 | 国产精品国产三级国产aⅴ无密码 | 男女免费在线观看视频 | 国产激情视频 | 成人免费三级电影 | 久久男女视频 | 精品国产乱码久久久久久牛牛 | 日韩av成人| 免费人成在线观看网站 | 天天综合永久 | 超碰国产在线 | 成人免费视屏 | 国产精品一区二区在线 | 国产精品区一区二区三区 | 狠狠天天 | 国产精品福利在线观看 | 精品在线播放 | 国产精品成av人在线视午夜片 | 美日韩免费视频 |