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

C++中const修飾成員函數(shù)

 更新時(shí)間:2026年02月03日 08:34:48   作者:挖礦大亨  
本文主要介紹了C++中const修飾成員函數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、const 成員函數(shù)的核心定義

const修飾成員函數(shù)時(shí),要寫在函數(shù)參數(shù)列表后、函數(shù)體前(有virtual則在virtual后),其核心作用是:保證該成員函數(shù)不會(huì)修改當(dāng)前對(duì)象的任何非靜態(tài)成員變量,且只能調(diào)用其他 const 成員函數(shù)。
語法格式:

// 聲明(類內(nèi))
返回值類型 函數(shù)名(參數(shù)列表) const;

// 定義(類外)
返回值類型 類名::函數(shù)名(參數(shù)列表) const {
    // 函數(shù)體
}

二、為什么需要 const 成員函數(shù)?

核心目的是保證 “常量對(duì)象” 的只讀性—— 當(dāng)一個(gè)對(duì)象被聲明為const(常量對(duì)象)時(shí),編譯器要求它只能調(diào)用const成員函數(shù),防止對(duì)象被意外修改。
先看一個(gè)沒有 const 成員函數(shù)的反例:

#include <iostream>
using namespace std;

class Person {
public:
    int age = 20;

    // 普通成員函數(shù):可修改成員變量
    void showAge() {
        cout << "Age: " << age << endl;
        // 即使沒修改,編譯器也認(rèn)為這個(gè)函數(shù)“可能修改”對(duì)象
    }
};

int main() {
    // 常量對(duì)象:不允許被修改
    const Person p;
    p.showAge(); // 編譯報(bào)錯(cuò)!常量對(duì)象不能調(diào)用普通成員函數(shù)

    return 0;
}

報(bào)錯(cuò)原因:編譯器無法確定showAge()是否會(huì)修改p,因此禁止常量對(duì)象調(diào)用普通成員函數(shù) —— 而const成員函數(shù)就是用來告訴編譯器:“這個(gè)函數(shù)絕對(duì)不會(huì)修改對(duì)象,放心讓常量對(duì)象調(diào)用”。

三、const 成員函數(shù)的使用規(guī)則(核心)

1.基礎(chǔ)規(guī)則:const 成員函數(shù)不能修改非靜態(tài)成員變量

#include <iostream>
using namespace std;

class Person {
public:
    int age = 20;
    static int total = 0; // 靜態(tài)成員變量

    // const成員函數(shù):只讀,不能修改非靜態(tài)成員
    void showAge() const {
        cout << "Age: " << age << endl; // 允許:僅讀取
        // age = 30; // 編譯報(bào)錯(cuò)!const函數(shù)不能修改非靜態(tài)成員變量

        total = 100; // 允許:靜態(tài)成員變量不屬于具體對(duì)象,不受const限制
    }

    // 普通成員函數(shù):可讀寫
    void setAge(int a) {
        age = a; // 允許修改
    }
};

int main() {
    // 1. 常量對(duì)象:只能調(diào)用const成員函數(shù)
    const Person p1;
    p1.showAge(); // 正常執(zhí)行
    // p1.setAge(30); // 編譯報(bào)錯(cuò)!常量對(duì)象不能調(diào)用普通成員函數(shù)

    // 2. 普通對(duì)象:既可以調(diào)用const成員函數(shù),也可以調(diào)用普通成員函數(shù)
    Person p2;
    p2.showAge(); // 正常執(zhí)行
    p2.setAge(30); // 正常執(zhí)行

    return 0;
}

2.進(jìn)階規(guī)則:const 成員函數(shù)只能調(diào)用其他 const 成員函數(shù)

class Person {
public:
    int age = 20;

    void func1() const {
        func2(); // 編譯報(bào)錯(cuò)!const函數(shù)不能調(diào)用普通成員函數(shù)
        func3(); // 允許:調(diào)用其他const成員函數(shù)
    }

    void func2() {
        // 普通成員函數(shù)
    }

    void func3() const {
        // const成員函數(shù)
    }
};

原因:普通成員函數(shù) “可能修改對(duì)象”,而 const 成員函數(shù)承諾 “不修改對(duì)象”,因此不能調(diào)用有修改風(fēng)險(xiǎn)的普通成員函數(shù)。

3. 例外:mutable 成員變量可被 const 函數(shù)修改

mutable(可變的)修飾的成員變量,突破 const 的限制 —— 即使在 const 成員函數(shù)中,也能修改mutable成員(用于存儲(chǔ) “邏輯上不影響對(duì)象常量性” 的狀態(tài),比如緩存、計(jì)數(shù)):

#include <iostream>
using namespace std;

class Person {
public:
    int age = 20;
    mutable int visitCount = 0; // 可變成員:記錄訪問次數(shù)

    void showAge() const {
        visitCount++; // 允許:mutable成員可被const函數(shù)修改
        cout << "Age: " << age << ",訪問次數(shù):" << visitCount << endl;
    }
};

int main() {
    const Person p;
    p.showAge(); // 輸出:Age: 20,訪問次數(shù):1
    p.showAge(); // 輸出:Age: 20,訪問次數(shù):2
    return 0;
}

四、底層原理:const 修飾的是 this 指針

const 成員函數(shù)的本質(zhì),是修改了this指針的類型:

  • 普通成員函數(shù)中,this的類型是:類類型* const(指針本身不可改,指向的對(duì)象可改);
  • const 成員函數(shù)中,this的類型是:const 類類型* const(指針本身不可改,指向的對(duì)象也不可改)。

編譯器視角的偽代碼對(duì)比:

// 普通成員函數(shù):void showAge(Person* const this)
void Person::showAge() {
    this->age = 30; // 允許:this指向的對(duì)象可改
}

// const成員函數(shù):void showAge(const Person* const this)
void Person::showAge() const {
    this->age = 30; // 報(bào)錯(cuò):this指向的對(duì)象是const,不可改
}

核心:const成員函數(shù)的this指針是 “指向 const 對(duì)象的 const 指針”,因此無法通過this修改成員變量 —— 這也是 const 函數(shù)不能修改非靜態(tài)成員的底層原因。

五、const 成員函數(shù)的重載

const 成員函數(shù)可以和普通成員函數(shù)構(gòu)成重載,編譯器會(huì)根據(jù)調(diào)用對(duì)象是否為 const,選擇對(duì)應(yīng)的版本:

#include <iostream>
using namespace std;

class Person {
public:
    int age = 20;

    // 普通版本:供普通對(duì)象調(diào)用
    void showAge() {
        cout << "普通版本:Age = " << age << endl;
    }

    // const版本:供常量對(duì)象調(diào)用
    void showAge() const {
        cout << "const版本:Age = " << age << endl;
    }
};

int main() {
    Person p1; // 普通對(duì)象
    p1.showAge(); // 調(diào)用普通版本

    const Person p2; // 常量對(duì)象
    p2.showAge(); // 調(diào)用const版本

    return 0;
}

總結(jié)

核心作用:const 成員函數(shù)承諾 “不修改對(duì)象的非靜態(tài)成員變量”,讓常量對(duì)象可以安全調(diào)用;

關(guān)鍵規(guī)則:

  • 不能修改非靜態(tài)成員變量(mutable成員除外);
  • 只能調(diào)用其他 const 成員函數(shù);
  • 可與普通成員函數(shù)構(gòu)成重載,編譯器根據(jù)對(duì)象是否 const 選擇版本;

底層本質(zhì):const 修飾的是this指針,使其變?yōu)閏onst 類類型* const,限制對(duì)對(duì)象的修改。
開發(fā)建議:只要成員函數(shù)不修改對(duì)象狀態(tài),就聲明為 const 成員函數(shù) —— 這是 C++“常量正確性” 的最佳實(shí)踐,能讓代碼更健壯、更易維護(hù)。

相關(guān)文章

  • C++中l(wèi)ist實(shí)現(xiàn)雙向循環(huán)鏈表詳細(xì)解析

    C++中l(wèi)ist實(shí)現(xiàn)雙向循環(huán)鏈表詳細(xì)解析

    雙向循環(huán)鏈表是一種重要的線性數(shù)據(jù)結(jié)構(gòu),支持前后雙向遍歷,適用于頻繁插入刪除和高效訪問的場(chǎng)景,這篇文章主要介紹了C++中l(wèi)ist實(shí)現(xiàn)雙向循環(huán)鏈表詳細(xì)解析的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01
  • 如何利用C語言位運(yùn)算解決只出現(xiàn)一次的數(shù)字

    如何利用C語言位運(yùn)算解決只出現(xiàn)一次的數(shù)字

    這篇文章主要給大家介紹了關(guān)于如何利用C語言位運(yùn)算解決只出現(xiàn)一次的數(shù)字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python/Java/JS語言調(diào)用C/C++庫(kù)的底層原理詳解

    Python/Java/JS語言調(diào)用C/C++庫(kù)的底層原理詳解

    開發(fā)過程中很多時(shí)候都會(huì)遇到調(diào)用C++動(dòng)態(tài)庫(kù)dll的需求,下面這篇文章主要介紹了Python/Java/JS語言調(diào)用C/C++庫(kù)的底層原理,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01
  • QT5實(shí)現(xiàn)UDP通信的示例代碼

    QT5實(shí)現(xiàn)UDP通信的示例代碼

    本文主要介紹了QT5實(shí)現(xiàn)UDP通信的示例代碼,主要使用QUdpSocket類用于實(shí)現(xiàn)UDP通信,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)

    圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)

    聚焦?C++?的?STL?中的?stack?和?queue,讓數(shù)據(jù)結(jié)構(gòu)變得簡(jiǎn)單有趣!?通過圖解的方式,我們將輕松理解這兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu),準(zhǔn)備好開啟?STL?學(xué)習(xí)之旅了嗎?讓我們一起探索?stack?和?queue?的奧秘吧!
    2024-03-03
  • C語言排序之?堆排序

    C語言排序之?堆排序

    這篇文章主要介紹了C語言排序之堆排序,文章基于C語言的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考資料,需要的小伙伴可以參考一下
    2022-04-04
  • C語言枚舉與聯(lián)合體深入詳解

    C語言枚舉與聯(lián)合體深入詳解

    枚舉顧名思義就是把所有的可能性列舉出來,像一個(gè)星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個(gè)聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開辟最大的變量的內(nèi)存,其他的變量都在那個(gè)變量占據(jù)空間
    2022-09-09
  • C++11右值引用和移動(dòng)語義的實(shí)例解析

    C++11右值引用和移動(dòng)語義的實(shí)例解析

    左值和右值都是針對(duì)表達(dá)式,左值是指表達(dá)式結(jié)束后依然存在的持久對(duì)象,右值是指表達(dá)式結(jié)束時(shí)就不再存在的臨時(shí)對(duì)象,下面這篇文章主要給大家介紹了關(guān)于C++11右值引用和移動(dòng)語義的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 在Linux下編譯C或C++程序的教程

    在Linux下編譯C或C++程序的教程

    這篇文章主要介紹了在Linux下編譯C或C++程序的教程,是C/C++入門學(xué)習(xí)中的必備知識(shí),需要的朋友可以參考下
    2015-07-07
  • 關(guān)于c語言逗號(hào)表達(dá)式的運(yùn)算規(guī)則知識(shí)點(diǎn)

    關(guān)于c語言逗號(hào)表達(dá)式的運(yùn)算規(guī)則知識(shí)點(diǎn)

    在本篇文章里小編給大家整理的是關(guān)于c語言逗號(hào)表達(dá)式的運(yùn)算規(guī)則知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)參考下。
    2020-03-03

最新評(píng)論

镶黄旗| 兴海县| 资中县| 武陟县| 庄浪县| 武冈市| 临清市| 桐梓县| 安西县| 珠海市| 峡江县| 蓬莱市| 杭州市| 保定市| 镇坪县| 泸州市| 湘阴县| 浦东新区| 蒙城县| 西乌珠穆沁旗| 黄大仙区| 和平区| 晋城| 扎囊县| 建阳市| 越西县| 吉林省| 大渡口区| 新晃| 南靖县| 和顺县| 修武县| 曲麻莱县| 固安县| 恩施市| 会泽县| 襄汾县| 桐柏县| 夏河县| 贵溪市| 恩施市|