C++11 新特性:常量表达式 constexpr(上)

C++11 引入了constexpr关键字,用于定义常量表达式,从而使变量获得在编译阶段即可计算出结果的能力,提高运行时的效率。

constexpr 的使用分两篇文章介绍,今天这篇文章主要讲解什么是常量表达式和 constexpr 典型使用场景的前三种用法。constexpr 在模板编程中的使用,在下篇文章中进行讲述。

什么是常量表达式

常量表达式(Constant Expression)指的是值在编译时就已经确定,并且在程序执行过程中不会改变的表达式。

在 C++ 中,常量表达式可以用于定义编译时常量、数组的大小、整型模板参数、编译时断言等场合,是提高程序效率、实现编译时计算的重要工具。

我们知道,C++ 在定义数组的时候,必须指定数组长度,长度不能用变量指定。

int myArray[10]; // 正确
int myArray[6 + 4]; // 正确
int len = 6;
int myArray[len]; // 错误,len 是变量

这里的 len 可以使用常量表达式替代。

常量表达式的特点

  • 编译时计算:保证变量或函数在编译时被求值,前提是所有参数或初始值也都是常量表达式。
  • 不变性:一旦编译确定,其值在程序运行期间不会改变。
  • 提高性能:通过在编译时进行计算,减少了运行时的计算负担。
  • 类型安全:与预处理器宏相比,常量表达式是类型安全的。

常量表达式的用途

  • 定义常量:提供编译时的常量定义,如数组大小、枚举值等。
  • 模板编程:作为模板参数,尤其是非类型模板参数,提供编译时的灵活性和强大功能。
  • 编译时断言:配合 static_assert 使用,进行编译时的条件检查。

constexpr 是对 C++ 中常量表达式概念的扩展,它可以用于变量、函数以及构造函数等。除了具有上述常量表达式的特点,constexpr 的使用范围更广。

constexpr 典型使用场景

  • 定义常量:用于定义编译时常量。
  • 编译时函数计算:定义能在编译时求值的函数。
  • 用于类和构造函数:在编译时创建对象。
  • 用于模板编程:在模板元编程和编译时断言中使用,根据编译时计算的结果做出决策。

1、定义常量

const int maxSize = 100; // 基本的常量表达式
constexpr int limit = maxSize + 1; // 编译时常量表达式constexpr size_t arraySize = 10;
int myArray[arraySize]; // 使用常量表达式作为数组大小

2、编译时函数计算

constexpr 还可以用于修饰函数的返回值,这样的函数又称为「常量表达式函数」。

注意,constexpr 函数体内的所有操作都必须是编译时确定的。一个函数要想成为常量表达式函数,必须满足如下 4 个条件。

  1. 整个函数的函数体中,除了可以包含 using 指令、typedef 语句以及 static_assert 断言外,只能包含一条 return 返回语句。

  2. 该函数必须有返回值,即函数的返回值类型不能是 void。

  3. 函数在使用之前,必须有对应的定义语句。普通的函数调用只需要提前写好该函数的声明部分即可,但常量表达式函数在使用前,必须要有该函数的定义。

  4. return 返回的表达式必须是常量表达式

constexpr int factorial(int n) {return n <= 1 ? 1 : (n * factorial(n - 1));
}int main() {constexpr int val = factorial(5); // 在编译时计算5!static_assert(val == 120, "Factorial of 5 should be 120."); // 使用编译时断言验证结果return 0;
}

3、用于类和构造函数

constexpr 也可以用于构造函数,使得对象可以在编译时被创建。

注意constexpr 修饰类的构造函数时,要求该构造函数的函数体必须为空,采用初始化列表的方式为各个成员赋值,且必须使用常量表达式。

前面提到,constexpr 可用于修饰函数,而类中的成员方法完全可以看做是「位于类这个命名空间中的函数」,所以 constexpr 也可以修饰类中的成员函数,只不过此函数必须满足前面提到的 4 个条件。

示例代码如下:

class Point {
public:constexpr Point(double xVal, double yVal) : x(xVal), y(yVal) {}constexpr double getX() const { return x; }constexpr double getY() const { return y; }private:double x, y;
};int main() {constexpr Point p(9.5, 7.3); // 编译时创建Point对象static_assert(p.getX() == 9.5, "X should be 9.5."); // 编译时断言return 0;
}

总结

constexpr 使得编译时计算和常量定义更加灵活和强大,有助于提高 C++ 程序的性能和类型安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/754920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式事务的解决方案--Seata架构

一、Seata的XA模式 二、AT模式原理 三、TCC模式原理 四、MQ分布式事务 异步&#xff0c;非实时&#xff0c;实现最终的一致性。 四、分布式事务的解决方案

Stable Diffusion WebUI 生成参数:宽度/高度/生成批次/每批数量/提示词相关性/随机种子

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文将继续了解 Stable Diffusion WebUI 的生成参数&#xff0c;主要内容有&#xff1a;宽度、高度、生成批次、每批数量、提示词相关性、随机种子。希望能对你…

Visual Studio 2022下配置 OpenMP 多线程编程环境与运行

目录 一创建项目时选择“创建新项目 -> 空项目 -> 下一步 -> 创建” 二右键“源文件 -> 添加 -> 新建项 -> 添加” 三配置 1. 测试程序&#xff1a; 最开始的时候错误很多&#xff1a; 2.将 “ include "stdafx.h" ” 删掉&#xff0c;添加 “…

电影院售票网站|基于SSM框架+ Mysql+Java+ B/S结构的电影院售票网站设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

linux安装mysql8.x

检查卸载mysql 1.查看当前安装mysql情况&#xff0c;查找以前是否装有mysql [rootmaster01 /]# rpm -qa|grep -i mysql mysql-libs-5.1.73-8.el6_8.x86_642.执行命令删除安装的MySQL [rootmaster01 /]# rpm -ev mysql-libs-5.1.73-8.el6_8.x86_64 --nodeps3.查看之前安装的MySQ…

操作系统知识-存储管理+文件管理管理-嵌入式系统设计师备考笔记

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记&#xff0c;未经本人许可&#xff0c;请勿转载&#xff0c;如发现本笔记内容的错误还望各位不吝赐教&#xff08;笔记内容可能有误怕产生错误引导&#xff09;。 本章的主要内容见下图&#xff1a; 1、存储管理&#…

【算法与数据结构】二叉树(前中后)序遍历

文章目录 &#x1f4dd;前言&#x1f320; 创建简单二叉树&#x1f309;二叉树的三种遍历&#x1f320;前序&#x1f309;中序遍历 &#x1f320;后序遍历 &#x1f320;二叉树节点个数&#x1f309;二叉树节点个数注意点 &#x1f6a9;总结 &#x1f4dd;前言 一棵二叉树是结…

6-181 统计无向图的连通分量

要求实现函数,能够统计并返回无向图(顶点数不超过100)的连通分量(极大连通子图)数,可增加自定义函数或借助STL(标准模板库)之queue(队列)。无向图采用邻接矩阵存储,输入的顶点从1开始编号,但顶点下标从0开始使用。 函数接口定义: int CountSubGraph(int mat[][N…

C++提高笔记(六)---STL函数对象、STL常用算法(遍历、查找)

1、STL-函数对象 1.1函数对象 1.1.1函数对象概念 概念&#xff1a; 重载函数调用操作符的类&#xff0c;其对象常称为函数对象 函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 本质&#xff1a;函数对象(仿函数)是一个类&#xff0c;不是一个…

linux常用指令

前言 大家好我是jiantaoyab&#xff0c;这篇文章给大家介绍Linux下常用的命令。 指令的本质也是Linux上的一些程序。 cd cd - 回到最近从哪来的路径 cd ~ 当前用户对应的工作目录&#xff08;普通用户&#xff1a;/home/xx root用户&#xff1a;/root&#xff09; cd / 去…

C语言经典面试题目(十九)

1、什么是C语言&#xff1f;简要介绍一下其历史和特点。 C语言是一种通用的高级计算机编程语言&#xff0c;最初由贝尔实验室的Dennis Ritchie在1972年至1973年间设计和实现。C语言被广泛应用于系统编程、应用程序开发、嵌入式系统和操作系统等领域。它具有高效、灵活、可移植…

【vscode】vscode重命名变量后多了很多空白行

这种情况&#xff0c;一般出现在重新安装 vscode 后出现。 原因大概率是语言服务器没设置好或设置对。 以 Python 为例&#xff0c;到设置里搜索 "python.languageServer"&#xff0c;将 Python 的语言服务器设置为 Pylance 即可。

React全家桶及原理解析-lesson4-Redux

lesson4-react全家桶及原理解析.mov React全家桶及原理解析 React全家桶及原理解析 课堂⽬标资源起步Reducer 什么是reducer什么是reduceRedux 上⼿ 安装reduxredux上⼿检查点react-redux 异步代码抽取Redux拓展 redux原理 核⼼实现中间件实现redux-thunk原理react-redux原理 实…

AI和信号处理推荐书单

推荐AI书单 1、《动手学深度学习-pytorch版》 https://item.m.jd.com/product/10068173196371.html?utm_sourceiosapp&utm_mediumappshare&utm_campaignt_335139774&utm_termCopyURL&ad_odshare&gxRnAomTM2bWfQmswcp40mDrUkxA7sLkk&gxdRnAoymFZOTXe…

【数据可视化】Echarts官方文档及常用组件

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. Echarts官方文档介绍3. ECharts基础架构及常用术语3.1 ECharts的基础架构3.2 ECharts的常用术语3.2.1 ECharts的基本名词3.2.2 ECharts的图表名词 4. 直角坐标系下的网格及坐标轴4.1 直角坐标系下的网格4.2…

关于BFF

BFF&#xff08;Backend For Frontend&#xff09;是一种架构设计模式&#xff0c;用于解决多端&#xff08;如Web、移动端等&#xff09;共用一个后端服务时的问题。BFF的主要目标是将前端与后端的业务逻辑分离&#xff0c;使得前端可以根据自身的需求定制接口和数据&#xff…

C++的语法

可能需要用到存储各种数据类型&#xff08;比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等&#xff09; 下表显示了各种变量类型在内存中存储值时需要占用的内存&#xff0c;以及该类型的变量所能存储的最大值和最小值。 注意&#xff1a;不同系统会有所差异 #inc…

CentOS7 操作firewall防火墙

常用命令 开启关闭防火墙 systemctl start/status/stop/disable firewalld查看默认区域名称 $ firewall-cmd --get-default-zone public查看区域信息 firewall-cmd --get-active-zones查看指定接口所属区域 firewall-cmd --get-zone-of-interfaceeth0查看防火墙配置 # 查…

Qt Excel文件读写

QAxObject是Qt框架中用于与ActiveX控件和COM对象进行交互的类。它使得在Qt应用程序中嵌入和使用ActiveX控件&#xff0c;或者操作COM对象成为可能。通过QAxObject&#xff0c;你可以在Qt中方便地操作Excel、Word等Office应用程序&#xff0c;以及许多其他支持ActiveX或COM技术的…

AI人工智能小程序系统开发

开发AI人工智能小程序系统需要以下步骤&#xff1a; 1. 确定需求&#xff1a;了解客户对人工智能小程序的期望&#xff0c;并分析系统的实际应用场景。 2. 设计架构&#xff1a;选择合适的技术框架和人工智能算法&#xff0c;进行小程序系统架构的设计。 3. 数据采集和处理&…