码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【c++】constexpr关键字


    这里写目录标题

    • constexpr修饰普通变量
    • constexpr修饰函数的返回值
      • 1. 该函数必须有返回值,即函数的返回值类型不能是 void。
      • 2.整个函数的函数体中,除了可以包含 using 指令、typedef 语句以及 static_assert 断言外,只能包含一条 return 返回语句。
      • 3.函数在使用之前,必须有对应的定义语句。
      • 4. return 返回的表达式必须是常量表达式
    • constexpr修饰类的构造函数

    constexpr 关键字的功能是使指定的常量表达式在程序编译阶段就获得结果,而不必等到程序运行阶段。
    C++ 11 标准中,constexpr 可用于修饰普通变量、函数(包括模板函数)以及类的构造函数。

    constexpr修饰普通变量

    使用 constexpr 修改普通变量时,变量必须经过初始化且初始值必须是一个常量表达式。

    int main()
    {
    	constexpr int num = 1 + 2;
    	int arr[num] = { 1,2,3 };
    	std::cout << arr[1] << std::endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在编译的时候,编译器就已经确定了num的值,同时确定了arr的长度。

    注意:当常量表达式中包含浮点数时,考虑到程序编译和运行所在的系统环境可能不同,常量表达式在编译阶段和运行阶段计算出的结果精度很可能会受到影响,因此 C++11 标准规定,浮点常量表达式在编译阶段计算的精度要大于等于运行阶段计算出的精度。

    constexpr修饰函数的返回值

    这样的函数又称为“常量表达式函数”。
    一个函数要想成为常量表达值函数,必须满足下面四个条件

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

    因为我们的目的是通过该函数获得一个常量。

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

    constexpr int fun(int x)
    {
    	int res = 1 + 2 + 3+x;
    	return res;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这种则不会在编译时就确定值,也不会提高运行时的效率。

    3.函数在使用之前,必须有对应的定义语句。

    即我们不能把函数的定义放到调用点后面,即使前面加了声名也不行。
    这样也不会在编译时就确定值。

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

    constexpr int fun(int x)
    {
    	return 1 + 2 + x;
    }
    
    • 1
    • 2
    • 3
    • 4

    这样也不会在编译时就确定值。

    constexpr修饰类的构造函数

    对于 C++ 内置类型的数据,可以直接用 constexpr 修饰,但如果是自定义的数据类型,直接用 constexpr 修饰是不行的。
    我们得先把它的构造函数有constexpr修饰,然后它的成员属性一定要用参数初始化列表初始化,构造函数的函数体里面不能有代码。

    class A
    {
    public:
    	constexpr  A(int value):value_(value){}
    private:
    	int value_;
    };
    int main()
    {
    	constexpr  A a(1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    Leetcode 652. 寻找重复的子树
    HDFS读写流程
    提高车联远控异常分析效率的设想
    Kubernetes(K8S第三部分之资源控制器)
    进程以及线程
    Spring 源码阅读(二)IoC 容器初始化以及 BeanFactory 创建和 BeanDefinition 加载过程
    break、continue、return中选择一个,我们结束掉它
    IDA Pro与x64dbg联动调试记录
    Python单元测试内置库uinttest使用介绍
    零基础学习大数据分析难吗?
  • 原文地址:https://blog.csdn.net/aoeaoao/article/details/128041636
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号