C++ 類(const修飾普通成員函數)

来源:https://www.cnblogs.com/loliconinvincible/archive/2020/03/20/12535515.html
-Advertisement-
Play Games

const修飾普通成員函數 我們知道this指針指向的是具體的對象,普通的成員函數存在(加深記憶),設計this指針的時候格式為*const this(常量指針)。 const修飾變數一般有兩種方式:const T *a,或者 T const *a,這兩者都是一樣的,主要看const位於*的左邊還是 ...


const修飾普通成員函數

我們知道this指針指向的是具體的對象,普通的成員函數存在(加深記憶),設計this指針的時候格式為*const this(常量指針)。

const修飾變數一般有兩種方式:const T *a,或者 T const *a,這兩者都是一樣的,主要看const位於*的左邊還是右邊,這裡不再贅述,主要來看一下當const修飾類的成員函數時,成員函數有什麼特點。

類的成員函數後面加 const ,錶面這個函數不會對這個類對象的數據成員(準確的說是非靜態數據成員)作任何改變。

 

在設計類的時候,一個原則就是對於不改變數據成員的成員函數都要在後面加const,而對於改變數據成員的成員函數不能加const。所以const關鍵字對成員函數的行為作了更加明確的限定:

 

1.有const修飾的成員(指 const 放在函數參數表的後面,而不是在函數前面或者參數表內),只能讀取數據成員,不能改變數據成員;

2.在類的成員函數後面加 const 還有什麼好處,那就是常量(即const)對象可以調用const成員函數,而不能調用非const 成員函數。

 

1 int myFun(void) const //const修飾的是成員函數
2 {}//函數內部不能修改 普通成員變數  mutable修飾時例外
 1 class Data
 2 {
 3 private:
 4     int data;
 5     
 6     mutable int num;
 7 public:
 8     //遍歷 成員的函數 不會去修改成員的值
 9     //如果函數不會更改成員數據 就讓編譯器知道 這是一個const函數
10     void myPrintData(void) const 
11     {
12         //data =10000;//err const修飾函數 函數不能操作普通成員變數
13         cout<<this->data<<endl;
14         //cout<<data<<endl;
15 
16         //mutable修飾的成員變數 可以修改
17         num = 200;
18     }
19     
20     Data()
21     {
22         cout<<"無參構造"<<endl;
23     }
24     Data(int data)
25     {
26         this->data =data;
27         cout<<"有參構造"<<endl;
28     }
29     Data(const Data &ob)
30     {
31         this->data = ob.data;
32         cout<<"拷貝構造"<<endl;
33     }
34     ~Data()
35     {
36         cout<<"析構函數"<<endl;
37     }
38 };
39 void test02()
40 {
41     Data ob1(100);
42     ob1.myPrintData();
43 }

2、const修飾對象 叫常對象

class Data
{
private:
    int data;

    mutable int num;
public:
    //遍歷 成員的函數 不會去修改成員的值
    //如果函數不會更改成員數據 就讓編譯器知道 這是一個const函數
    void myPrintData(void) const
    {
        //data =10000;//err const修飾函數 函數不能操作普通成員變數
        cout<<this->data<<endl;
        //cout<<data<<endl;

        //mutable修飾的成員變數 可以修改
        num = 200;
    }

    //編譯器認為 普通成員函數 存在修改成員變數 可能
    void setData(int data) const
    {
        //this->data = data;
        return;
    }
    Data()
    {
        cout<<"無參構造"<<endl;
    }
    Data(int data)
    {
        this->data =data;
        cout<<"有參構造"<<endl;
    }
    Data(const Data &ob)
    {
        this->data = ob.data;
        cout<<"拷貝構造"<<endl;
    }
    ~Data()
    {
        cout<<"析構函數"<<endl;
    }
};
void test03()
{
    //常對象
    const Data ob1(200);

    //常對象 只能調用const修飾的函數 遍歷成員數據
    ob1.setData(20000);

    ob1.myPrintData();
}

總結:

1)const成員函數可以訪問非const對象的非const數據成員、const數據成員,也可以訪問const對象內的所有數據成員;

2)非const成員函數可以訪問非const對象的非const數據成員、const數據成員,但不可以訪問const對象的任意數據成員

3)作為一種良好的編程風格,在聲明一個成員函數時,若該成員函數並不對數據成員進行修改操作,應儘可能將該成員函數聲明為const 成員函數。

4)如果只有const成員函數,非const對象是可以調用const成員函數的。當const版本和非const版本的成員函數同時出現時,非const對象調用非const成員函數。

const int num = 10;//系統不會給num開闢空間 num被放入符號表中 如果後期對&num 這時系統才會給num開闢空間
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先下載好軟體,鏈接在這裡 鏈接:https://pan.baidu.com/s/1op-W-ZX1tqefHffs3m-r0A 提取碼:0jwm 這裡麵包含了Rational Rose 2007版的可視化建模軟體,也包含了破解文件,直接下載就可以了。 我在網上按照其他人的按照過程中出現了安裝之後打 ...
  • [toc] 領域驅動設計 運用領域模型 綁定模型和實現 聰明的項目組成員花費了幾個月的時間進行仔細的研究並且開發出了詳盡的領域模型(類圖)。然而對類圖研究不能讓我深入地瞭解該應用程式的代碼和設計,這讓我備感困擾。當開發人員開始實現應用程式時,他們很快就發現,儘管分析人員說得頭頭是道,他們依然無法將這 ...
  • [toc] 運用領域模型 交流與語言的使用 非原創,感謝《領域驅動設計》這本書 領域模型可成為軟體項目通用語言的核心。該模型是一組得自於項目人員頭腦中的概念,以及反映了領域深層含義的術語和關係。這些術語和相互關係提供了模型語言的語義,雖然語言是為領域量身定製的,但就技術開發而言,其依然足夠精確。正是 ...
  • [toc] 運用領域模型 消化知識 非原創,感謝《領域驅動設計》這本書 有效建模的要素 (1) 模型和實現的綁定。最初的原型雖然簡陋,但它在模型與實現之間建立了早期鏈接,而且在所有後續的迭代中我們一直在維護該鏈接。 (2) 建立了一種基於模型的語言。隨著項目的進展,雙方都能夠直接使用模型中的術語,並 ...
  • 前言 談到JAVA,就不得不提JVM JAVA程式員繞不開的話題.也許有童鞋會說,我不懂JVM,但是我一樣可以寫出JAVA代碼,我相信說這種話的童鞋,往往是只有1 3年的初級開發人員,對JAVA理解還不深,不明白JVM的重要性,那接下來我們來說說,為什麼要學習JVM? 1.理解JVM,才能幫助我們寫 ...
  • 一、BufferedWriter 1.使用帶有緩衝區的字元讀和寫進行試驗 package com.bjpowernode.java_learning; import java.io.*; ​ public class D100_1_BufferedWriter { public static voi ...
  • 隨機回去10位幸運者的名單,依次遞減,最後一位就是幸運者 1 package com.lottery.controller; 2 3 import java.io.BufferedReader; 4 import java.io.FileReader; 5 import java.io.IOExce ...
  • 線程池 導包: 回調函數非同步將可迭代對象中的元素進行某種操作 註意事項:callback必須有一個參數,且只能有一個參數 非同步主要是被應用在耗時的操作 測試:同步&非同步效率 搭建一個flask,自己啟動服務,測試執行時間 新建一個 新建一個 文件夾,在該文件夾下創建一個HTML文件,我寫的是 ,隨便 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...