constexpr关键字

news2024/12/23 8:42:43

1.const

在c++11之前只有const关键字,主要有两个作用:变量只读,修饰常量。 

2.constexpr

在c++11中新添加了关键字constexpr(作用:用于修饰常量表达式) 常量表达式:由多个常量组成并在编译过程中就能得到计算结果的表达式。

C++从编写完毕到执行一共要经历4个阶段:预处理、编译、汇编、链接。

常量表达式和非常量表达式的计算时机不同:

  • 非常量表达式只能在运行阶段计算出结果
  • 常量表达式的计算发生在编译阶段

建议:

  • 凡是表达“只读”语义的场景都使用const
  • 表达常量语义的场景使用constexpr
  • 其实在定义常量时const 和 constexpr都能使用

3.const 和 constexpr 在使用上可等价

const int a=666; //常量表达式
const int b=a+1; //常量表达式

constexpr int a=666; //常量表达式
constexpr int b=a+1; //常量表达式

注意:在c++中 constexpr 可以用来修饰内置的数据类型 ,但是不能直接用于修饰自定义的数据类型(直接修饰无效)

如果需要修饰自定义的数据类型可以这样写(可以在实例化自定义数据类型时使用constexpr)

如何将自定义的数据类型定义为常量:

struct Test{
    int x;
    int y;
};


void test01(){
    constexpr Test t{1,2};
    constexpr int x=t.x;
    constexpr int y=t.y;
    cout<<x<<endl;
    cout<<y<<endl;
}

4.常量表达式函数

我们可以通过使用constexpr修饰函数的返回值,这种函数被称为常量表达式函数

要求:

  • 函数必须要有返回值,并且return返回的表达式必须是常量表达式
  • 函数在使用之前,必须有对应的定义语句
#include <iostream>
using namespace std;
constexpr int a=666; //常量表达式
constexpr int b=a+1; //常量表达式
struct Test{
    int x;
    int y;
};
constexpr int func(); //常量表达式函数声明
//声明要在定义之前
constexpr int func(){ //常量函数表达式定义
    constexpr int c=100; //局部常量表达式
    return c;
}
void test01(){
    constexpr Test t{1,2};
    constexpr int x=t.x;
    constexpr int y=t.y;
    cout<<x<<endl;
    cout<<y<<endl;
    func();
}

int main() {
    test01();
    system("pause");
    return 0;
}
  • 整个函数的函数体中不能出现除(using、typedef、static_assert、return)的非常量表达式语句

5.修饰模板函数

c++11中constexpr 可以用于修饰模板函数,但是由于模板中类型的不确定性,模板函数实例化后的函数是否符合常量表达式函数的要求也是不确定的。

  • 如果模板函数实例化后不满足常量表达式函数的要求,那么constexpr会被自动忽略,这个函数称为一个普通函数。

6.修饰构造函数

常量构造函数:构造函数的函数体必须为空,并且采用初始化列表的方式为各个成员赋值

#include <iostream>
using namespace std;

class Person{
public:
    constexpr Person(int age):m_age(age){

    }
int m_age;
};


int main() {
    constexpr Person p(25);
    cout << p.m_age << endl;
    system("pause");
    return 0;
}

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

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

相关文章

React16新手教程记录

文章目录 前言一些前端面试题1. 搭建项目1. 1 cdn1. 2 脚手架 2. 基础用法2.1 表达式和js语句区别&#xff1a;2.2 jsx2.3 循环map2.4 函数式组件2.5 类式组件2.6 类组件点击事件2.6.1 事件回调函数this指向2.6.2 this解决方案2.6.2.1 通过bind2.6.2.2 箭头函数&#xff08;推荐…

MySQL数据库增删查改(基础)CRUD

CRUD 即增加 (Create) 、查询 (Retrieve) 、更新 (Update) 、删除 (Delete) 四个单词的首字母缩写。 1. 新增&#xff08;Create&#xff09; 1.1单行数据&#xff08;全列插入&#xff09; 比如说&#xff1a;创建一张学生表&#xff0c;有姓名&#xff0c;学号。插入两个学…

C++和OpenGL实现3D游戏编程【连载7】——文字和汉字的显示

1、本节实现的内容 上一节我们讨论了纹理在二维平面内不规则图形贴图的相关基础操作,本节我们开始了解游戏里文字以及汉字的显示方法。本节课我们将从基本的ASCII字符显示,拓展到中文字符的显示,最后再讲到纹理字符的显示,并对各种文字显示方法的优缺点和使用场景进行分析…

改进YOLO的群养猪行为识别算法研究及部署(小程序-网站平台-pyqt)

概述 群养猪的运动信息和行为信息与其健康状况息息相关&#xff0c;但人工巡视费时费力&#xff0c;本实验提出采用行为识别算法于群养猪的养殖管理中&#xff0c;识别群养猪drink&#xff08;饮水&#xff09;、stand&#xff08;站立&#xff09;和lie&#xff08;躺卧&#…

[STM32]从零开始的STM32标准库环境搭建(小白向)

一、我们为什么要搭建STM32标准库开发环境 如果你对STM32有一定的了解&#xff0c;相信你已经认识了STM32的几种开发方式。基于STM32寄存器开发&#xff0c;基于ST官方的标准库开发&#xff0c;基于ST官方的HAL库开发。我们现在来了解一下这些库的优缺点。首先就是基于寄存器开…

【计算机组成原理】七、输入/输出系统:1.I/O基本概念、I/O设备(外部设备)

七、输入/输出系统 文章目录 七、输入/输出系统1.基本概念4. I/O设备&#xff08;外部设备&#xff09;4.1输出设备4.1.1键盘4.1.2鼠标 4.2输出设备4.2.1显示器4.2.2打印机 4.3外存设备 1.基本概念 “I/O”就是“输入/输出”( Input/Output)。 I/O系统由I/O软件和I/O硬件两部分…

精益管理:怎样选择适合的库存管理策略?

如果顾客在下单后愿意耐心等待产品制作完成&#xff0c;对于生产管理者而言&#xff0c;自然是最为方便的。一般而言&#xff0c;水电工程行承接的订单&#xff0c;顾客都只能耐心等待工作完成&#xff1b;但这只是个别情况&#xff0c;实际上大部分顾客并没有这么多耐心&#…

【k8s系列】Kubernetes Service 深度解析:从基础到实战

一、前言 在当今的云原生世界中&#xff0c;Kubernetes 已经成为容器编排和管理的事实标准。它提供了一种强大的方式来部署、扩展和管理容器化应用。然而&#xff0c;随着应用规模的扩大和复杂性的增加&#xff0c;如何有效地暴露和管理这些应用的网络服务成为了一个关键问题。…

Google Gemini 使用 | 中小型企业借助谷歌 Gemini 提高生产力的 5 种方法

Gemini Business for Workspace 融合了谷歌最强 AI 技术&#xff0c;并集成到办公产品组件中的解决方案。 无论是中型的家族企业&#xff0c;还是刚起步的小型创业团队&#xff0c;你们是否觉得一天 24 小时根本不够用&#xff1f;既要忙着客户维系和拉新&#xff0c;又要管理员…

pda移动护理终端医用手持机

随着物联网技术的发展&#xff0c;智能设备之间形成了紧密的网络互联。 医疗行业越来越注重智能设备的使用&#xff0c;医用手持机可以采集病人、药品、材料等信息&#xff0c;很大程度地改善了医院患者的管理&#xff0c;进一步提升医护人员的工作效率。 医护人员通过使用pda移…

【开学季】告别一次性AI写作工具,打造你自己的专属AI助手!

新学期的钟声敲响&#xff0c;校园里充满了书本的香气和求知的热情。&#x1f4da;可许多学生和职场人士&#xff0c;仍然依赖那些一次性的AI写作工具来完成自己的写作任务。我想问你&#xff1a;为什么不尝试自己构建一个属于自己的AI写作工作流呢&#xff1f;&#x1f914; 前…

机器学习:自然语言处理之关键词提取(TF-IDF)

目录 前言 一、TF-IDF 1.TF 2.IDF 3.TF-IDF计算法则 4.TF-IDF的本质 二、代码实现 1.导入库 2.读取文本数据 3. 初始化TfidfVectorizer并转换文本数据 4. 获取词汇表并创建 DataFrame 5.处理每篇文章的特征 总结 前言 TF-IDF&#xff08;Term Frequency-Inverse D…

MySql字段有null值与其他值的比较

MySql字段有null值与其他值的比较 SELECT count(1)在这里插入代码片FROM LAW_ENFORCEMENT_TROUBLE TBWHERE TB.STATUS 1AND TB.DUTY_LIMIT_DATE < NOW()AND TB.TROUBLE_STATUS ! 2查出结果为0条&#xff0c;但是应该为3条&#xff0c;查看表数据发现&#xff0c;TROUBLE_S…

常见图像图片属性的介绍与说明

图像属性是指图像的一些基本特征和参数&#xff0c;它们定义了图像的外观和存储方式。以下是一些常见的图像属性&#xff1a; 1. 分辨率&#xff1a; 分辨率通常以像素数&#xff08;如800x600&#xff09;来表示&#xff0c;指的是图像的宽度和高度上的像素点数。分辨率越高&…

mysql5.7 TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ 换版8版本 引发的问题

mysql5.7 TIMESTAMP NOT NULL DEFAULT 0000-00-00 00:00:00 换版引发的问题 问题背景sql_mode上机演示5.78.4 问题背景 在项目mysql版本由5.7 换版到8.4版本后&#xff0c;我们进行回归测试时&#xff0c;却发现一个积年代码报错了&#xff0c;是数据库插入报的错 xxx can not…

自用Office 365家庭版全家桶 + OneDrive 1TB拼车,40/年,来长期拼的!

自用Office 365家庭版全家桶 OneDrive 1TB拼车&#xff0c;40/年&#xff0c;来长期拼的! &#x1f50d;1.背景描述&#x1f50d;&#x1f421;2. 常见问题解答&#x1f421;【问】是正版吗&#xff1f;【问】跟普通版本有什么区别&#xff1f;【问】会不会是假货? &#x1f…

1、Java简介+DOS命令+java的编译运行(字节码/机器码、JRE/JVM/JDK/JIT的区别)+一个简单的Java程序

前言&#xff1a;本文属于黑马程序员和javaguide的混合笔记&#xff0c;仅作学习分享使用&#xff0c;建议感兴趣的小伙伴去看黑马原视频或javaguide原文。如有侵权&#xff0c;请联系删除。 Java类型&#xff1a; JavaSE 标准版&#xff1a;以前称为J2SE&#xff0c;主要用来…

掌握一招:‌输入什么命令,‌轻松查看电脑IP地址?‌

在日常使用电脑的过程中&#xff0c;‌无论是进行网络设置、‌远程连接还是解决网络问题&#xff0c;‌了解并查看自己的电脑IP地址都是一项基础且重要的操作。‌对于许多用户来说&#xff0c;‌可能并不清楚如何快速准确地获取这一信息。‌本文将为你揭秘一个简单实用的命令&a…

【数据结构与算法】:十大经典排序算法

文章目录 前言一、冒泡排序&#xff08;Bubble Sort&#xff09;1.1 冒泡排序原理1.2 冒泡排序代码1.3 输出结果 二、选择排序&#xff08;Selection Sort&#xff09;2.1 选择排序原理2.2 选择排序代码2.3 输出结果 三、插入排序&#xff08;Insertion Sort&#xff09;3.1 插…

可重入VI,VI模板和动态VI之间的差异 转

可重入VI 当您想要同时运行同一VI的多个实例时&#xff0c;将使用可重入VI。当VI不可重入时&#xff0c;VI只有一个数据空间。因此&#xff0c;一次只能有一个调用者运行VI&#xff0c;因此调用者可能必须“等待轮到它”时才能使用VI。这是VI的默认选项&#xff0c;但您可以将V…