C++面試3——const關鍵字的核心概念、典型場景和易錯陷阱

const關鍵字的核心概念、典型場景和易錯陷阱


一、const本質:類型系統的守護者

1. 與#define的本質差異
維度#defineconst
編譯階段預處理替換編譯器類型檢查
作用域無作用域(全局污染)遵循塊作用域
調試可見性符號消失保留符號信息
類型安全無類型強類型約束
內存分配不占內存(文本替換)占用內存(可取地址)

致命陷阱示例:

#define MAX_SIZE 1024
const int max_size = 1024;char buffer1[MAX_SIZE*2];   // 正確,宏在編譯前展開
char buffer2[max_size*2];   // C++11前錯誤,const變量不是編譯期常量
2. constexpr的救贖(C++11)
constexpr int max_size = 1024;  // 真正的編譯期常量
char buffer[max_size*2];        // 合法

二、類中的const攻防戰

1. 成員變量:初始化列表的獨裁
class Matrix {
public:Matrix(int w) : width(w) {} // 必須通過初始化列表
private:const int width;  // const成員變量mutable int cache; // 可變成員(即使const對象也可修改)
};

極端案例:

class Immortal {
public:Immortal() {}  // 錯誤!未初始化const成員year
private:const int year = 2023; // C++11允許類內初始化
};
2. 成員函數:const的雙重含義
class DataPool {
public:void modify() const { // 錯誤!不能修改非mutable成員// count++;  }void nonConstFunc() { // 非const函數可修改成員}
};

重載的黑暗法則:

class Logger {
public:void log() const { /* 讀操作 */ }void log() { /* 寫操作 */ }
};const Logger cl;
cl.log();  // 調用const版本
Logger l;
l.log();   // 調用非const版本

三、指針與const的糾纏

1. 聲明順序的死亡游戲
int a = 10;
const int* p1 = &a;  // 指向常量的指針(底層const)
int const* p2 = &a;  // 等同p1
int* const p3 = &a;  // 常量指針(頂層const)
const int* const p4 = &a; // 雙const

指針常量 vs 常量指針:

  • 左定值(const在*左邊):指向的值不可變
  • 右定向(const在*右邊):指針本身不可變
2. 類型轉換的修羅場
const int* pci = &a;
int* pi = const_cast<int*>(pci);  // 去const化(危險!)
*pci = 20;  // 未定義行為(原始對象非常量時可能成功)

安全轉換法則:

  • 只有原始對象本身是非const的,才能用const_cast去掉const屬性

四、函數簽名中的const暗戰

1. 參數傳遞:效率與安全的博弈
void process(const BigObject& obj);  // 避免拷貝+防止修改
void dangerous(const int* ptr);      // 可能被const_cast突破防御
2. 返回值修飾:所有權的宣誓
const std::string& getConfig();  // 返回只讀引用
const int* getRawData() const;   // 承諾不修改數據

死亡陷阱:

const int& func() {int local = 42;return local;  // 返回局部變量的引用!
}

五、高級戰場:模板與const

1. 類型推導的混沌法則
template<typename T>
void deduce(T param) {}const int ci = 10;
deduce(ci);    // T推導為int(const被剝離)
deduce(&ci);   // T推導為const int*
2. const與完美轉發
template<typename T>
void relay(T&& arg) {process(std::forward<T>(arg));
}relay(ci);  // 轉發后保持const屬性

六、面試核彈級問題

  1. 如何讓const成員函數修改成員變量?

    • 使用mutable修飾成員變量
    • const_cast去除this指針的const屬性(危險操作)
  2. const成員函數調用非const函數是否合法?

    class Test {
    public:void foo() { }void bar() const {foo();  // 錯誤!const函數不能調用非const成員函數}
    };
    
  3. 為什么函數重載時const可以作為區分?

    • 編譯器將const成員函數視為void func(const T* this)
    • 非const版本為void func(T* this)

總結:const的哲學

  • 契約精神:對編譯器承諾數據不可變
  • 防御性編程:限制意外修改,提升代碼健壯性
  • 類型系統武器:與引用、模板等特性配合構建安全屏障

掌握const的每個細節,相當于拿到了C++類型系統的核按鈕——既能保證代碼安全,又能精準控制程序的每一塊內存。

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

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

相關文章

16-看門狗和RTC

一、獨立看門狗 1、獨立看門狗概述 在由單片機構成的微型計算機系統中&#xff0c;由于單片機的工作常常會受到來自外界電磁場的干擾&#xff0c;造成程序的跑飛&#xff08;不按照正常程序進行運行&#xff0c;如程序重啟&#xff0c;但是如果我們填加看門狗的技術&#xff0…

w~自動駕駛~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法來啦&#xff01; 在自動駕駛系統當中&#xff0c;感知任務是整個自駕系統中至關重要的組成部分。感知任務的主要目標是使自動駕駛車輛能夠理解和感知周圍的環境元素&…

怎么打包發布到npm?——從零到一的詳細指南

怎么打包發布到npm&#xff1f;——從零到一的詳細指南 目錄 怎么打包發布到npm&#xff1f;——從零到一的詳細指南一、準備工作1. 注冊 npm 賬號2. 安裝 Node.js 和 npm 二、初始化項目三、編寫你的代碼四、配置 package.json五、打包你的項目六、登錄 npm七、發布到 npm八、…

【C++ - 仿mudou庫one thread one loop式高并發服務器實現】

文章目錄 項目介紹項目模塊和服務器主要設計模式項目主要流程前置知識1.bind函數2.定時器任務TimerTask和時間輪思想TimerWheel3.正則表達式4.通用型容器Any類 服務器設計模式1&#xff09;單Reactor單線程模式2&#xff09;單Reactor多線程模式3&#xff09;多Reactor多線程模…

RISC-V 開發板 MUSE Pi Pro USB 測試(3.0 U盤,2.0 UVC攝像頭)

視頻講解&#xff1a; RISC-V 開發板 MUSE Pi Pro USB 測試&#xff08;3.0 U盤&#xff0c;2.0 UVC攝像頭&#xff09; 總共開發板有4個USB的A口&#xff0c;1個USB的TypeC口&#xff0c;我們插上兩個USB3.0的U盤和一個USB2.0的UVC攝像頭來進行測試 lsusb -tv 可以看到有3個US…

docker學習與使用(概念、鏡像、容器、數據卷、dockerfile等)

文章目錄 前言引入docker 簡介docker的應用場景docker的虛擬化技術VS虛擬機docker的優點docker架構Docker倉庫Docker鏡像linux操作系統的大致組成部分 Docker容器 docker安裝與啟動校驗版本移除舊的版本安裝依賴工具設置軟件源安裝docker驗證 配置鏡像加速器docker服務相關命令…

記錄一次服務器卡頓

一、服務器卡頓現象 服務用了一段時間后&#xff0c;突然很卡&#xff0c;發現在服務器上新建excel也很卡&#xff0c;發現服務器中病毒了&#xff0c;然后重新安裝了操作系統。重新安裝服務環境時&#xff0c;發現同時安裝pdf、tomcat時都很慢&#xff0c;只能一個安裝好了&am…

基于 Reactor 的 Java 高性能異步編程:響應式流與背壓詳解

本文將圍繞 Reactor 框架&#xff0c;深入剖析響應式流的核心機制&#xff0c;重點講解背壓&#xff08;Backpressure&#xff09;的實現原理與實際應用。通過理論結合實踐&#xff0c;希望幫助你真正掌握 Java 世界的響應式異步編程。 一、響應式編程與 Reactor 簡介 1.1 什么…

知識蒸餾實戰:用PyTorch和預訓練模型提升小模型性能

在深度學習的浪潮中&#xff0c;我們常常追求更大、更深、更復雜的模型以達到最先進的性能。然而&#xff0c;這些“龐然大物”般的模型往往伴隨著高昂的計算成本和緩慢的推理速度&#xff0c;使得它們難以部署在資源受限的環境中&#xff0c;如移動設備或邊緣計算平臺。知識蒸…

python:mysql全局大覽(保姆級教程)

本文目錄&#xff1a; 一、關于數據庫**二、sql語言分類**三、數據庫增刪改查操作**四、庫中表增刪改查操作**五、表中記錄插入**六、表約束**七、單表查詢**八、多表查詢**&#xff08;一&#xff09;外鍵約束**&#xff08;二&#xff09;連結查詢**1.交叉連接&#xff08;笛…

Android framework 問題記錄

一、休眠喚醒&#xff0c;很快熄屏 1.1 問題描述 機器休眠喚醒后&#xff0c;沒有按照約定的熄屏timeout 進行熄屏&#xff0c;很快就熄屏&#xff08;約2s~3s左右&#xff09; 1.2 原因分析&#xff1a; 抓取相關log&#xff0c;打印休眠背光 相關調用棧 //具體打印調用棧…

怎么利用JS根據坐標判斷構成單個多邊形是否合法

怎么利用JS根據坐標判斷構成單個多邊形是否合法 引言 在GIS(地理信息系統)、游戲開發、計算機圖形學等領域,判斷一組坐標點能否構成合法的簡單多邊形(Simple Polygon)是一個常見需求。合法多邊形需要滿足幾何學上的基本規則,本文將詳細介紹如何使用JavaScript實現這一判…

sqlite的拼接字段的方法(sqlite沒有convert函數)

我在sqlserver 操作方式&#xff1a; /// <summary>///獲取當前門店工資列表/// </summary>/// <param name"wheres">其他條件</param>/// <param name"ThisMendian">當前門店</param>/// <param name"IsNotU…

構建高效移動端網頁調試流程:以 WebDebugX 為核心的工具、技巧與實戰經驗

現代前端開發早已不僅僅局限于桌面瀏覽器。隨著 Hybrid 應用、小程序、移動 Web 的廣泛應用&#xff0c;開發者日常面臨的一個關鍵挑戰是&#xff1a;如何在移動設備上快速定位并解決問題&#xff1f; 這不再是“打開 DevTools 查查 Console”的問題&#xff0c;而是一個關于設…

新興技術與安全挑戰

7.1 云原生安全(K8s安全、Serverless防護) 核心風險與攻擊面 Kubernetes配置錯誤: 風險:默認開放Dashboard未授權訪問(如kubectl proxy未鑒權)。防御:啟用RBAC,限制ServiceAccount權限。Serverless函數注入: 漏洞代碼(AWS Lambda):def lambda_handler(event, cont…

《算法筆記》11.7小節——動態規劃專題->背包問題 問題 C: 貨幣系統

題目描述 母牛們不但創建了他們自己的政府而且選擇了建立了自己的貨幣系統。 [In their own rebellious way],&#xff0c;他們對貨幣的數值感到好奇。 傳統地&#xff0c;一個貨幣系統是由1,5,10,20 或 25,50, 和 100的單位面值組成的。 母牛想知道有多少種不同的方法來用貨幣…

SN生成流水號并且打亂

目前公司的產品會通過sn綁定賬號&#xff0c;但是會出現一個問題&#xff0c;流水號會容易被人猜出來導致被他人在未授權的情況下使用&#xff0c;所以開發了一個生成流水號后打亂的python程序&#xff0c;比如輸入sn的前11位后&#xff0c;后面的字符所有的排列組合有26^4方種…

msq基礎

一、檢索數據 SELECT語句 1.檢索單個列 SELECT prod_name FROM products 上述語句用SELECT語句從products表中檢索一個名prod_name的列&#xff0c;所需列名在SELECT關鍵字之后給出&#xff0c;FROM關鍵字指出從其中檢索數據的表名 &#xff08;返回數據的順序可能是數據…

【回溯 剪支 狀態壓縮】# P10419 [藍橋杯 2023 國 A] 01 游戲|普及+

本文涉及知識點 C回溯 位運算、狀態壓縮、枚舉子集匯總 P10419 [藍橋杯 2023 國 A] 01 游戲 題目描述 小藍最近玩上了 01 01 01 游戲&#xff0c;這是一款帶有二進制思想的棋子游戲&#xff0c;具體來說游戲在一個大小為 N N N\times N NN 的棋盤上進行&#xff0c;棋盤…

2025華為OD機試真題+全流程解析+備考攻略+經驗分享+Java/python/JavaScript/C++/C/GO六種語言最佳實現

華為OD全流程解析&#xff0c;備考攻略 快捷目錄 華為OD全流程解析&#xff0c;備考攻略一、什么是華為OD&#xff1f;二、什么是華為OD機試&#xff1f;三、華為OD面試流程四、華為OD薪資待遇及職級體系五、ABCDE卷類型及特點六、題型與考點七、機試備考策略八、薪資與轉正九、…