條款03:盡可能使用 const

const 允許我們指定一個語義約束,使某個值應該保持不變

1、const 修飾 變量,指針,函數,函數返回值等,可以使程序減少錯誤,或者更容易檢測錯誤:

? ? ? ? 指針常量:int* const p;//指針地址不可變,指針指向值可變

? ? ? ? 常量指針:const int* p;//指針指向值不可變,指針地址可變

? ? ? ? 常量指針常量:const int* const p;//都不可變

const 修飾迭代器:

? ? ? ? iterator 相當于 T* const //指針常量

? ? ? ? const_iterator 相當于 const T* //常量指針

const 修飾函數返回值:

const int max(int a, int b)
{a > b ? a : b;
}int c = 6;
max(a,b) = c;
//將 c 的值賦給 max(a, b) 是沒有意義的,const 防止這種操作的發生

2、const 修飾成員函數

? ? ? ? 如果兩個成員函數只是常量性不同(其他相同)則可以發生重載

? ? ? ? ? ? ? ? const 類對象調用 const 成員函數

? ? ? ? ? ? ? ? non-const 類對象調用普通成員函數

bitwise:

? ? ? ? const 成員函數不能改變(除 static)成員變量的值,因為常函數里 this 指針指向的值不可改變。同理,const 對象不可以調用 non-const 函數,因為函數有能力更改成員屬性的值。

? ? ? ? 但是若成員變量是一個指針,僅僅改變指針指向的值卻不改變指針地址(地址是 this 指向的值),則不算是 const 函數 ,但能夠通過 bitwise 測試。

? ? ? ? 使用 mutable 可以消除 non-static 成員變量的 bitwise constness 約束。

class person
{
public:person(int a){m_id = a;}int& func() const{m_id = 888;}mutable int m_id;
};?int main()
{const person p(666);p.func();cout << p.m_id << endl;system("pause");return 0;
}


3、當 const 和 non-const 成員函數有實質的等價實現時,利用兩次轉型,令 non-const 調用 const 可以避免代碼重復。

const char& operator[](int pos) const
{//...//...return name[pos];
}char& operator[](int pos)
{returnconst_cast<char&>//移除第一次轉型添加的 const(static_cast<const classname>(*this)[pos]//把 classname 類型數據轉換為 const classname//使得能夠調用 const operator[]);
}

? ? ? ? ? ? ? ? ? ?
原文鏈接:https://blog.csdn.net/qq_62674741/article/details/124896986

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895508.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895508.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895508.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法兵法全略(譯文)

目錄 始計篇 謀攻篇 軍形篇 兵勢篇 虛實篇 軍爭篇 九變篇 行軍篇 地形篇 九地篇 火攻篇 用間篇 始計篇 算法&#xff0c;在當今時代&#xff0c;猶如國家關鍵的戰略武器&#xff0c;也是處理各類事務的核心樞紐。算法的世界神秘且變化萬千&#xff0c;不夠賢能聰慧…

開關電源實戰(一)寬范圍DC降壓模塊MP4560

系列文章目錄 文章目錄 系列文章目錄MP4560MP4560 3.8V 至 55V 的寬輸入范圍可滿足各種降壓應用 MOSFET只有250mΩ 輸出可調0.8V-52V SW:需要低VF肖特基二極管接地,而且要靠近引腳,高壓側開關的輸出。 EN:輸入使能,拉低到閾值以下關閉芯片,拉高或浮空啟動 COMP:Compens…

微軟AutoGen高級功能——Magentic-One

介紹 大家好&#xff0c;博主又來給大家分享知識了&#xff0c;這次給大家分享的內容是微軟AutoGen框架的高級功能Magentic-One。那么它是用來做什么的或它又是什么功能呢&#xff0c;我們直接進入正題。 Magentic-One Magnetic-One是一個通用型多智能體系統&#xff0c;用于…

DeepSeek是如何通過“蒸餾”技術打造自己的AI模型

1 引言&#xff1a; 最近&#xff0c;外媒對中國公司——DeepSeek進行了猛烈抨擊&#xff0c;指控其采用了所謂的“蒸餾”&#xff08;Distillation&#xff09;技術&#xff0c;涉嫌抄襲甚至作弊。那么&#xff0c;什么是“蒸餾”技術&#xff1f; 在人工智能領域&#xff0c;…

【廣州大學主辦,發表有保障 | IEEE出版,穩定EI檢索,往屆見刊后快至1個月檢索】第二屆電氣技術與自動化工程國際學術會議 (ETAE 2025)

第二屆電氣技術與自動化工程國際學術會議 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大會官網&#xff1a;http://www.icetae.com/【更多詳情】 會議時間&#xff1a;2025年4月25-27日 會議地點&#xff1a…

伯克利 CS61A 課堂筆記 08 —— Strings and Dictionaries

本系列為加州伯克利大學著名 Python 基礎課程 CS61A 的課堂筆記整理&#xff0c;全英文內容&#xff0c;文末附詞匯解釋。 目錄 01 Strings 字符串 Ⅰ Strings are An Abstraction. Ⅱ Strings Literals have Three Forms Ⅲ String are Sequences 02 Dictionaries 字典 …

基于 GEE 計算研究區年均地表溫度數據

目錄 1 代碼解析 2 完整代碼 3 運行結果 1 代碼解析 &#xff08;1&#xff09;定義研究區&#xff1a; // 研究區的范圍需要自己提前上傳 var dataset table;// 將研究區顯示在中心&#xff0c;后面的數字為縮放等級&#xff0c;范圍從1 - 24 Map.centerObject(dataset,…

docker compose快速部署kafka-connect集群

先部署kafka集群&#xff0c;啟動 參考&#xff1a;docker compose部署kafka集群-CSDN博客 創建timezone文件&#xff0c;內容填寫Asia/Shanghai 再部署kafka-connect集群 networks: net: external: true services: kafka-connect1: restart: always image:…

Hutool - BloomFilter:便捷的布隆過濾器實現

1. 布隆過濾器簡介 布隆過濾器&#xff08;Bloom Filter&#xff09;是一種空間效率極高的概率型數據結構&#xff0c;用于判斷一個元素是否存在于一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法&#xff0c;但缺點是有一定的誤判率&#xff0c;即判斷元素存在…

日常知識點之遺留問題梳理(定時器/時間輪定時器)

1&#xff1a;簡單基礎 定時器的核心知識點&#xff0c;對我來說就是獲取當前時間和設置回調函數。 簡單練習&#xff1a; ? c語言通過gettimeofday 獲取當前時間并進行處理 ? 回調函數的定義&#xff08;函數參數有必要適當存儲&#xff09; typedef void(Timerfunc)(vo…

Python + WhisperX:解鎖語音識別的高效新姿勢

大家好&#xff0c;我是烤鴨&#xff1a; 最近在嘗試做視頻的質量分析&#xff0c;打算利用asr針對聲音判斷是否有人聲&#xff0c;以及識別出來的文本進行進一步操作。asr看了幾個開源的&#xff0c;最終選擇了openai的whisper&#xff0c;后來發現性能不行&#xff0c;又換了…

$ npx electron-forge import 一直報權限問題 resource busy or locked,

jackLAPTOP-7DHDAAL0 MINGW64 /e/project/celetron-project/my-electron-app (master) $ npx electron-forge import > Checking your system > Checking git exists > Checking node version > Checking packageManager version √ Found node22.14.0 √ Found gi…

mapbox 從入門到精通 - 目錄

&#x1f468;??? 主頁&#xff1a; gis分享者 &#x1f468;??? 感謝各位大佬 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;??? 收錄于專欄&#xff1a;mapbox 從入門到精通 文章目錄 一、&#x1f340;總目錄1.1 ?? mapbox基礎1.2 ??…

Kotlin 2.1.0 入門教程(十五)繼承、重寫、派生類初始化順序

繼承 所有類都有一個共同的超類 Any&#xff0c;對于沒有聲明超類型的類來說&#xff0c;Any 是其默認的超類&#xff1a; // 隱式繼承自 Any。 class ExampleAny 有三個方法&#xff1a;equals()、hashCode() 和 toString()。因此&#xff0c;所有類都定義了這些方法。 默認…

sqlilabs--小實驗

一、先盲注判斷 ?id1 and sleep(2)-- 如果發現頁面存在注點&#xff0c;使用時間盲注腳本進行注入 import requestsdef inject_database(url):name for i in range(1, 20): # 假設數據庫名稱長度不超過20low 48 # 0high 122 # zmiddle (low high) // 2while low &l…

【數字】異步FIFO面試的幾個小問題與跨時鐘域時序約束

入門數字設計的時候&#xff0c;跨時鐘域的數據處理是繞不開的課題&#xff0c;特別是多比特數據跨時鐘域時&#xff0c;都會采用異步FIFO的方法。 異步FIFO中涉及較多的考點這里記錄幾個以供大家參考。 1. 異步FIFO的空滿判斷分別在哪個域&#xff1f; 根據異步FIFO的結構&…

淺談Java Spring Boot 框架分析和理解

Spring Boot是一個簡化Spring開發的框架&#xff0c;它遵循“約定優于配置”的原則&#xff0c;通過內嵌的Tomcat、Jetty或Undertow等容器&#xff0c;使得開發者能夠快速構建獨立運行的、生產級別的基于Spring框架的應用程序。Spring Boot包含了大量的自動配置功能&#xff0c…

算法06-回溯算法

一、回溯算法詳解 回溯算法是一種通過逐步構建解決方案來解決問題的算法。它通常用于解決組合問題、排列問題、子集問題等。回溯算法的核心思想是“試錯”&#xff0c;即在每一步嘗試所有可能的選項&#xff0c;如果發現當前選擇無法達到目標&#xff0c;就回退到上一步&#…

RabbitMQ學習—day2—安裝

目錄 普通Linux安裝 安裝RabbitMQ 1、下載 2、安裝 3. Web管理界面及授權操作 Docker 安裝 強力推薦學docker&#xff0c;使用docker安裝 普通Linux安裝 安裝RabbitMQ 1、下載 官網下載地址&#xff1a;https://www.rabbitmq.com/download.html(opens new window) 這…

降本增效 - VGF 構建輕量高性能日志管理平臺

VFG 技術架構 Filebeat 接收Syslog &#xff0c;并進行日志分段&#xff0c;VictoriaLogs 持久化存儲日志 &#xff0c;Grafana 可視化、數據查詢、告警、數據導出。 為什么要用VictoriaLogs &#xff1f; 與Elasticsearch /Grafana Loki相比幾十倍的CPU/內存/存儲資源占用的…