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.mzph.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配…