C++中constexpr和#define定義常量的區別

在C++中,使用 constexpr 來定義常量和使用宏 #define 有幾個關鍵區別:

  1. 類型安全constexpr 常量有類型,宏沒有類型。
  2. 作用域constexpr 常量遵循C++的作用域規則,而宏是文本替換,不遵循作用域規則。
  3. 調試constexpr 常量在調試時可見,宏通常不可見。
  4. 編譯時計算constexpr 常量是編譯時常量,允許編譯器進行優化,而宏只是簡單的文本替換。

你可以在類內使用 constexpr 來定義常量,并規定這些常量只在類的范圍內生效。以下是一個示例:

#include <iostream>class MyClass {
public:static constexpr int ARRAY_SIZE = 148;  // 使用 constexpr 定義常量void print() const {int name[ARRAY_SIZE];  // 使用類內的常量定義數組大小for (int i = 0; i < ARRAY_SIZE; ++i) {name[i] = i;}for (int i = 0; i < ARRAY_SIZE; ++i) {std::cout << name[i] << " ";}std::cout << std::endl;}
};int main() {MyClass myObject;myObject.print();return 0;
}

在這個示例中:

  • static constexpr int ARRAY_SIZE = 148; 在類內定義一個 constexpr 常量。
  • 這個常量 ARRAY_SIZE 是靜態的,屬于類本身,可以在類的所有成員函數中使用。
  • print 成員函數中,使用 ARRAY_SIZE 定義數組的大小。

區分 constexpr 和宏的區別

  1. 類型安全

    • constexpr int ARRAY_SIZE = 148;:類型安全,ARRAY_SIZE 是一個 int 類型的常量。
    • #define ARRAY_SIZE 148:宏沒有類型,簡單的文本替換。
  2. 作用域

    • constexpr:遵循C++的作用域規則,只在定義它的作用域內有效。
    • #define:宏在整個翻譯單元中有效,不受作用域限制。
  3. 調試

    • constexpr:常量在調試時可見,可以檢查其值。
    • #define:宏在預處理階段替換后不可見,調試時難以檢查。
  4. 編譯時計算

    • constexpr:允許編譯器在編譯時進行計算和優化。
    • #define:簡單的文本替換,不涉及編譯時計算。

限定常量只在類內函數生效

如果你想限制常量只在類內的某些函數中生效,可以將 constexpr 定義在函數內部,但這樣定義的常量只在該函數內有效。例如:

#include <iostream>class MyClass {
public:void print() const {constexpr int ARRAY_SIZE = 148;  // 僅在這個函數中有效int name[ARRAY_SIZE];for (int i = 0; i < ARRAY_SIZE; ++i) {name[i] = i;}for (int i = 0; i < ARRAY_SIZE; ++i) {std::cout << name[i] << " ";}std::cout << std::endl;}void anotherFunction() const {// 這里不能使用 ARRAY_SIZE,因為它只在 print 函數中定義}
};int main() {MyClass myObject;myObject.print();return 0;
}

在這個示例中,constexpr int ARRAY_SIZE = 148; 定義在 print 成員函數內,因此它的作用范圍僅限于 print 函數,其他函數無法訪問它。這種方式可以確保常量只在特定函數中生效。

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

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

相關文章

基于xilinx FPGA的GTX/GTH/GTY位置信息查看方式(如X0Y0在bank幾)

目錄 1 概述2 參考文檔3 查看方式4查詢總結&#xff1a; 1 概述 本文用于介紹如何查看xilinx fpga GTX得位置信息&#xff08;如X0Y0在哪個BANK/Quad&#xff09;。 2 參考文檔 《ug476_7Series_Transceivers》 《pg156-ultrascale-pcie-gen3-en-us-4.4》 3 查看方式 通過…

語音大模型引領自然交互新時代,景聯文科技推出高質量語音大模型數據庫

近期&#xff0c;OpenAI正式發布語音大模型GPT-4o&#xff0c;可以綜合利用語音、文本和視覺信息進行推理&#xff0c;扮演一個個人語音交互助手。 在音頻處理方面&#xff0c;它不僅能識別和轉錄多種口音和方言&#xff0c;改變語音的速度音調和振動&#xff0c;還能進行聲音模…

vue中數據響應式選擇ref還是reactive?

vue中響應式選擇ref還是reactive合適 語法上來說&#xff0c;兩者都可以實現響應式&#xff0c;之所以有ref和reactive&#xff0c;是為了更加方便的將不同的數據類型分類處理。 主要區別&#xff1a;reactive只能聲明對象/數組&#xff0c;ref可以響應任意數據類型&#xff…

Vue.js 中的 v-if 和 v-show

Vue.js 中的 v-if 和 v-show&#xff1a;詳細解析與比較 在 Vue.js 中&#xff0c;v-if 和 v-show 是兩個常用的指令&#xff0c;用于控制元素的顯示和隱藏。盡管它們都能達到類似的效果&#xff0c;但它們的工作原理和適用場景有著顯著的區別。本文將深入探討這兩者之間的異同…

Codeforces Round 952 (Div. 4) G. D-Function 題解 數學 數論

D-Function 題目描述 Let D ( n ) D(n) D(n) represent the sum of digits of n n n. For how many integers n n n where 1 0 l ≤ n < 1 0 r 10^{l} \leq n < 10^{r} 10l≤n<10r satisfy D ( k ? n ) k ? D ( n ) D(k \cdot n) k \cdot D(n) D(k?n)k?D…

mybatisplus新增數據時生成的雪花id太長前端接收不準確怎么辦?

這是后端返回的&#xff1a;1807308955001573377 這是前端接收的&#xff1a;1807308955001573400 返回的long類型超過前端的最大長度了&#xff0c;渲染不了 只需要在WebMvcConfiguration配置類中重寫方法&#xff0c;如下 Overrideprotected void configureMessageConver…

深度學習:C++和Python如何對大圖進行小目標檢測

最近在醫美和工業兩條線來回穿梭&#xff0c;甚是疲倦&#xff0c;一會兒搞搞醫美的人像美容&#xff0c;一會兒搞搞工業的檢測&#xff0c;最近新接的一個項目&#xff0c;關于瑕疵檢測的&#xff0c;目標圖像也并不是很大吧&#xff0c;需要放大后&#xff0c;才能看見細小的…

基于Java的跨平臺移動應用開發

基于Java的跨平臺移動應用開發 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討基于Java的跨平臺移動應用開發&#xff0c;這是一種強大的技術方案…

使用 App Store Connect API 生成和讀取分析報告

文章目錄 前言安裝 API Swift SDK配置 API Swift SDK生成分析報告獲取所有可用的報告獲取報告的分段下載分段的數據總結 前言 Apple 最近推出了50多個新的分析報告&#xff0c;其中包含數百個新的數據點和指標&#xff0c;以幫助開發者了解他們的應用程序的表現情況。 這些報…

構建安全穩定的應用:Spring Security 實用指南

前言 在現代 Web 應用程序中&#xff0c;安全性是至關重要的一個方面。Spring Security 作為一個功能強大且廣泛使用的安全框架&#xff0c;為 Java 應用程序提供了全面的安全解決方案。本文將深入介紹 Spring Security 的基本概念、核心功能以及如何在應用程序中使用它來實現…

相比共享代理,為什么要用獨享代理IP?

隨著互聯網的廣泛普及和應用&#xff0c;涉及網絡隱私、數據安全和網絡訪問控制的問題變得越來越重要。代理服務器作為一種常見的網絡工具&#xff0c;可以在跨境電商、海外社媒、SEO投放、網頁抓取等領域發揮作用&#xff0c;實現匿名訪問并加強網絡安全。在代理服務器類別中&…

Hadoop:全面深入解析

Hadoop是一個用于大規模數據處理的開源框架&#xff0c;其設計旨在通過集群的方式進行分布式存儲和計算。本篇博文將從Hadoop的定義、架構、原理、應用場景以及常見命令等多個方面進行詳細探討&#xff0c;幫助讀者全面深入地了解Hadoop。 1. Hadoop的定義 1.1 什么是Hadoop …

CDC模型

引言 聚類是一種強大的機器學習方法&#xff0c;用于根據特征空間中元素的接近程度發現相似的模式。它廣泛用于計算機科學、生物科學、地球科學和經濟學。盡管已經開發了最先進的基于分區和基于連接的聚類方法&#xff0c;但數據中的弱連接性和異構密度阻礙了其有效性。在這項…

Linux 下的性能監控與分析技巧

在日常的服務器管理和問題診斷過程中&#xff0c;Linux 命令行工具提供了強大的支持。本文通過幾個常用的示例&#xff0c;介紹如何快速定位問題、監控服務器性能。 無論你是編程新手還是有一定經驗的開發者&#xff0c;理解和掌握這些命令&#xff0c;都將在你的工作中大放異…

第四篇——作戰篇:戰爭里的激勵與成本

目錄 一、背景介紹二、思路&方案三、過程1.思維導圖2.文章中經典的句子理解3.學習之后對于投資市場的理解4.通過這篇文章結合我知道的東西我能想到什么&#xff1f; 四、總結五、升華 一、背景介紹 前面進行了分析之后&#xff0c;這篇顯然又從經濟的角度進行了介紹和分析…

STELLA系統動態模擬技術及在農業、生態及環境等科學領域中的應用技術

STELLA是一種用戶友好的計算機軟件。通過繪畫出一個系統的形象圖形&#xff0c;并給這個系統提供數學公式和輸入數據&#xff0c;從而建立模型。依據專業興趣&#xff0c;STELLA可以用來建立各種各樣的農業、生態、環境等方面的系統動態模型&#xff0c;為科研、教學、管理服務…

用例子和代碼了解詞嵌入和位置編碼

1.嵌入&#xff08;Input Embedding&#xff09; 讓我用一個更具體的例子來解釋輸入嵌入&#xff08;Input Embedding&#xff09;。 背景 假設我們有一個非常小的詞匯表&#xff0c;其中包含以下 5 個詞&#xff1a; "I""love""machine"&qu…

10 Posix API與網絡協議棧

POSIX概念 POSIX是由IEEE指定的一系列標準,用于澄清和統一Unix-y操作系統提供的應用程序編程接口(以及輔助問題,如命令行shell實用程序),當您編寫程序以依賴POSIX標準時,您可以非常肯定能夠輕松地將它們移植到大量的Unix衍生產品系列中(包括Linux,但不限于此!)。 如…

DeepFaceLive----AI換臉簡單使用

非常強大的軟件,官方github https://github.com/iperov/DeepFaceLive 百度云鏈接: 鏈接&#xff1a;https://pan.baidu.com/s/1VHY-wxqJXSh5lCn1c4whZg 提取碼&#xff1a;nhev 1下載解壓軟件 下載完成后雙擊.exe文件進行解壓.完成后雙擊.bat文件打開軟件 2 視頻使用圖片換…

k8s部署單機版mysql8

一、創建命名空間 # cat mysql8-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: mysql8labels:name: mysql8# kubectl apply -f mysql8-namespace.yaml namespace/mysql8 created# kubectl get ns|grep mysql8 mysql8 Active 8s二、創建mysql配…