10、const和constexpr區別

来源:https://www.cnblogs.com/dbai/archive/2023/03/13/17212678.html
-Advertisement-
Play Games

首先理解常亮表達式。常量表達式是指值不會改變,並且在編譯過程就能計算得到結果。 const修飾的對象無法修改,constexpr對象在編譯期間就確定且無法修改。 constexpr變數,編譯器在編譯階段驗證變數是否為一個常量表達式。 constexpr側重變數初值編譯階段確定,且無法修改。如果認定變 ...


首先理解常亮表達式。常量表達式是指值不會改變,並且在編譯過程就能計算得到結果。

  1. const修飾的對象無法修改,constexpr對象在編譯期間就確定且無法修改。
  2. constexpr變數,編譯器在編譯階段驗證變數是否為一個常量表達式。
  3. constexpr側重變數初值編譯階段確定,且無法修改。如果認定變數是一個常量表達式,就把它聲明稱constexpr類型。
  4. 兩者都必須初始化。

1、const

const int i = get_size(); // 運行時初始化
const iny j = 42; // 編譯時初始化

1.1 const對象僅在文件內有效

如果要多個文件共用一個const對象,需要加關鍵字extern

extern const int i =10;

1.2 頂層和底層const

頂層const指針自身無法修改
底層const指針可以修改

int i = 10;
int *const p1 = &i; // 頂層const:不能修改p1的值
const int *p2 = &i; // 底層const:不能修改p2指針指向
const int *const p3 = &i; // 底層+頂層const
const int &r = i; // 底層const:不能通過r修改i值

1.3 const代替#define

程式編譯過程氛圍:預處理、編譯和鏈接。#define在預處理階段接回展開,在編譯階段如果遇到錯誤,報錯信息不明朗。

// 不推薦
#define e 2.7

// 推薦
const double e = 2.7;

1.4 修飾變數

const int sz = get_size(); // 雖然sz無法改變,但get_size() 編譯階段無法確定值,也就是說sz不是常量表達式

1.5 修飾指針

int i = 1;
int *const p1 = &i; // 頂層const
const int *p2 = &i; // 底層const

1.6 修飾函數

int size() const { curSize = 1; return curSize; }; // 錯誤:const函數不能修改任何類的數據成員
int size() const { setSize(); return curSize; } // 錯誤:const函數只能調用const函數
const int size() { return curSize; }  // 函數返回值為const類型

2、constexpr

C++11引入了常量表達式constexpr的概念,指的是值不會改變並且在編譯期間就能得到計算結果的表達式。

const int i = 1;          // 常量表達式
const int j = i + 1;       // 常量表達式
const int k = size();      // 當size()是一個constexpr函數時才是常量表達式,

2.1 修飾變數

constexpr int i = 20; // 字面量20是常量表達式
constexpr int j = i + 1; // mf + 1是常量表達式
constexpr int k = size(); // 只有當size是constexpr函數時,才是正確的

2.2 修飾指針

constexpr修飾指針,僅對指針有效,與指針所指對象無關

// j的定義必須放在函數體外
int j = 30;

// 函數體內
constexpr int *p1 = &j; // 等價於 int constexpr *p1 = &j;
*p1 = 40; // 正確
p1 = nullptr; // 錯誤,constexpr指針無法修改

2.3 修飾函數

constexpr無法修飾成員函數,只能作為函數返回值類型,表明該函數返回的是一個編譯期可確定的常量;constexpr 被隱式隱式指定為內聯函數,只能在類的聲明中定義(.h文件)

// 函數返回值為constexpr類型
constexpr int getMaxSize() { return INT_MAX; } // 正確示例:返回常量值
// 錯誤示例:vec.size()運行時確定,不能在編譯期決定
constexpr int getMaxSize() 
{
	std::vector<int> vec;
	vec.push_back(1);
	vec.push_back(2);
	return vec.size();
}
// 正確:雖然看起來返回的是變數,但編譯器可確定
constexpr int getMaxSize(int a, int b) 
{
  return a + b;
}

部分內容來源:(明明1109)原文鏈接:https://www.cnblogs.com/fortunely/p/14550145.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這篇文章主要描述應用程式之間的通信協議,包括進行數據“斷句”的兩種不同方法,以及在應用協議層面實現高性能的雙工通信。 ...
  • 簡介 建造者模式(Builder Pattern),也叫生成器模式,屬於創建型模式。它使用多個簡單的對象一步一步構建成一個複雜的對象。它允許你使用相同的創建代碼生成不同類型和形式的對象。 當你希望使用代碼創建不同形式的產品 (例如各種商品和訂單) 時, 一些基本部件不會變,而其組合經常變化的時候,就 ...
  • 軟體設計開發某種意義上是“取”與“舍”的藝術。 關於性能方面,就像建築設計成抗震9度需要額外的成本一樣,高性能軟體系統也意味著更高的實現成本,有時候與其他質量屬性甚至會衝突,比如安全性、可擴展性、可觀測性等等。 大部分時候我們需要的是:在業務遇到瓶頸之前,利用常見的技術手段將系統優化到預期水平。 ...
  • Spring:現代Java開發的必備框架 Spring是一個輕量級的Java框架,它提供了各種企業級應用程式開發的工具和技術。Spring框架的核心是IoC容器和AOP框架。IoC容器使得Java應用程式的組件化變得更加容易,AOP框架使得Java應用程式的切麵編程變得更加容易。Spring框架還提 ...
  • 1、當使用生成介面 生成全局模型時, 生成的validate文件的namespace錯誤 應為 namespace app\common\validate;實際為 namespace app\api\validate;解決方法:1、找到 application/admin/library/buiap ...
  • 容器功能 1.Spring註入組件的註解 Spring中的傳統註解@Component、@Controller、@Service、@Repository,在SpringBoot中仍然有效。 2.@Configuration @Configuration是 Spring 3.0 添加的一個註解,用來代 ...
  • 我是3y,一年CRUD經驗用十年的markdown程式員👨🏻‍💻常年被譽為職業八股文選手 開源項目消息推送平臺austin倉庫地址: 消息推送平臺🔥推送下發【郵件】【簡訊】【微信服務號】【微信小程式】【企業微信】【釘釘】等消息類型。 https://gitee.com/zhongfuchen ...
  • 搞懂無鎖編程的重要一步是完全理解記憶體順序! 本教程由作者和ChatGPT通力合作完成。 都有哪幾種? c++的記憶體模型共有6種 memory_order_relaxed memory_order_consume memory_order_acquire memory_order_release me ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...