inline、常量表达式、表达式求值顺序

26. 扩展的inline说明符

C++中的inline说明符通常用于提示编译器将函数展开(即在调用点替换为函数体),以避免函数调用的开销。但随着C++标准的发展,inline说明符不仅仅局限于此。尤其是在C++11及以后的标准中,inline的用途有所扩展,涵盖了更多与链接和符号可见性相关的功能。

  • 在类中声明并定义inline静态变量(C++17引入)
// MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H

#include <iostream>

class MyClass {
public:
    inline static int staticVar = 10;  // 使用inline定义静态变量
    static void printStaticVar() {
        std::cout << "staticVar: " << staticVar << std::endl;
    }
};

#endif // MYCLASS_H

27. 常量表达式

在 C++ 中,常量表达式constexpr)是用于在编译期求值的表达式。它在程序的编译过程中进行计算,这可以提高代码性能,减少运行时的计算负担。C++11 引入了 constexpr 关键字,并在 C++14、C++17 和 C++20 中对其进行了进一步改进。

  • 常量表达式是一种编译期常量,即编译器能够在编译阶段对表达式进行求值并得到结果,而不是在运行时求值。
    • 提高编译期求值:通过将部分计算移到编译期,减少运行时开销。
    • 常量化表达式:在编译期进行验证和强制检查,避免运行时出错。
  • constexpr 可以用于:
    • 变量
    • 函数
    • 构造函数
  • constexpr 变量必须在编译期可以确定它的值。因此,只能用常量表达式来初始化它。
  • 常量表达式函数是可以在编译期求值的函数,返回值可以用于初始化 constexpr 变量。
class Point {
public:
    constexpr Point(double x, double y) : x_(x), y_(y) {}

    constexpr double getX() const { return x_; }
    constexpr double getY() const { return y_; }

private:
    double x_;
    double y_;
};

int main() {
    constexpr Point p1(1.0, 2.0);   // 编译期创建对象
    constexpr double x = p1.getX(); // 编译期获取 x 坐标
}
  • constexpr 函数要求

    • 在 C++11 中,constexpr 函数的主体只能包含单一的 return 语句。
    • 在 C++14 中,constexpr 函数放宽了要求,可以包含更复杂的逻辑,例如循环、条件语句等。
    • 在 C++20 中,constexpr 函数可以包含几乎所有语言特性,例如 try-catch 块,但仍然要求这些代码在常量上下文中能够执行。

28. 确定的表达式求值顺序(C++17)

函数参数求值顺序(未定义)

函数参数的求值顺序在 C++ 标准中通常是未定义的,即编译器可以选择以任意顺序求值函数参数。例如:

foo(bar(), baz());

后缀表达式

对于通过 .-> 进行的多级函数调用,方法的调用顺序是确定的,从左到右依次执行。例如:

obj.method1(foo(), bar()).method2(baz(), qux());

在这种情况下,执行顺序为:

  1. 首先求值 foo()bar()(顺序未定义),然后调用 method1(foo(), bar())
  2. 然后求值 baz()qux()(顺序未定义),再调用 method2(baz(), qux())

因此,foo()bar() 必须在 method1() 被调用之前完成,同样,baz()qux() 必须在 method2() 被调用之前完成

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI大模型】本地部署 Code Llama 大模型

要在本地部署 Code Llama 大模型并结合 Text Generation Web UI 实现远程运行 LLM&#xff08;大语言模型&#xff09;&#xff0c;你需要完成以下几个步骤&#xff1a; 1. 准备环境 1.1 硬件和软件要求 硬件&#xff1a; GPU&#xff08;如 NVIDIA 及支持 CUDA 的显卡&#…

内衣迷你洗衣机什么牌子好?内衣洗衣机2024年口碑指数排行榜推荐

内衣专用的洗衣机是一种专门设计用于洗涤内衣和贴身衣物的小型洗衣机。相比于普通的大型洗衣机&#xff0c;这样的小型洗衣机在设计和功能上有很大的区别。内衣专用的迷你洗衣机可以有效地保护内衣和贴身衣物的质量和卫生。在传统的洗衣机中&#xff0c;如果经常将内衣裤、袜子…

RabbitMQ 中的交换机学习

RabbitMQ 中的交换机学习 一、直接交换机&#xff08;Direct Exchange&#xff09; 1. 介绍 Direct 交换机将消息路由到绑定了指定 Routing Key 的队列中。每条消息都有一个 Routing Key&#xff0c;当队列绑定到 Direct 交换机时&#xff0c;它需要一个指定的 Routing Key。…

使用Python实现某易云音乐歌曲下载

前言 在这篇文章中,我们将探讨如何通过Python结合JavaScript代码来逆向网易云音乐的API接口,以获取并下载指定歌曲。请注意,本文仅用于技术学习与交流目的,实际使用时请遵守相关法律法规及服务条款。 目标网站 1. 准备工作 首先,我们需要安装一些必要的库: execjs:用…

揭秘灼口综合征:你的舌头痛竟是这些原因在作祟!

在日常生活中&#xff0c;你是否曾遭遇过舌头像被火烧般的灼痛感&#xff1f;这种让人难以忍受的症状&#xff0c;其实是一种名为“灼口综合征”的疾病表现。今天&#xff0c;我们就来深入探讨这一疾病的背后原因&#xff0c;让你了解这一病症的真相&#xff0c;从而更好地应对…

随记:有关idea中jdk版本

第一个地方&#xff1a;这个可能就是你整个项目的jdk版本的使用&#xff0c;你改了这里大概率可以改了 第二个地方&#xff1a; 就是 有关maven项目的 pom文件 一开始我的第一地方用的是 17 但是这里用的是8 但是运行的时候还是 17 这里可能是 maven的 项目这个地方只是对…

Unity导入.FBX模型设置

** Unity导入.FBX模型设置 ** 第一步、导入.fbx模型 Assets- Import New Asset 第二步、设置 Animation Type 为Legacy 这里导入的是非人形模型设置为Lagacy None&#xff1a;不导入动画Animation Clip Legacy&#xff1a;用于早期动画设置&#xff0c;其不支持状态机A…

WebSocket状态码及异常报错1006

文章目录 1.WebSocket协议简介2.WebSocket状态码的作用&#xff1a;3.WebSocket状态码1006详解1.问题原因2.解决方案 1.WebSocket协议简介 WebSocket协议是一种基于TCP的协议&#xff0c;它通过在浏览器和服务器之间建立一条持久的双向通信通道&#xff0c;实现了实时的数据传…

Web,RESTful API 在微服务中的作用是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Web&#xff0c;RESTful API 在微服务中的作用是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Web&#xff0c;RESTful API 在微服务中的作用是什么&#xff1f; 在微服务架构中&#xff0c;Web 和 RESTful …

NVIDIA 发布适用于网络安全的 NIM Blueprint

德勤使用适用于容器安全的 NVIDIA NIM Agent Blueprint 帮助企业利用开源软件构建安全的 AI。 文章目录 &#x1f64a; 德勤使用 NVIDIA AI 保障软件安全&#x1f64a; 通过生成式 AI 保障软件安全&#x1f64a; 适用于网络安全成功的蓝图&#x1f3a0; 什么是 NVIDIA NIM Agen…

javaWeb项目-ssm+jsp高校毕业生就业满意度调查统计系统功能介绍

本项目源码&#xff08;点击下方链接下载&#xff09;&#xff1a;java-ssmjsp毕业生就业满意度调查系统实现源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&…

Java使用原生HttpURLConnection实现发送HTTP请求

Java 实现发送 HTTP 请求&#xff0c;系列文章&#xff1a; 《Java使用原生HttpURLConnection实现发送HTTP请求》 《Java使用HttpClient5实现发送HTTP请求》 《SpringBoot使用RestTemplate实现发送HTTP请求》 1、HttpURLConnection 类的介绍 HttpURLConnection 是 Java 提供的…

字幕怎么自动生成?教你5种视频加字幕方法

在这个短视频时代&#xff0c;视频内容已成为传播信息、娱乐大众的重要载体。而字幕作为视频不可或缺的一部分&#xff0c;不仅能够提升观众的观看体验&#xff0c;还能跨越语言障碍&#xff0c;让所有观众都能享受视频的魅力。但怎么给视频加上字幕呢&#xff1f;下面给大家分…

图像及视频的基本操作

文章目录 一、认识计算机中的图像二、图像数据的读取三、数据读取-视频四、图像的其他操作 一、认识计算机中的图像 一张彩色图片是由很多个像素点组合而成的&#xff0c;而一个像素点是由R G B三个通道组成。RGB代表红色&#xff08;Red&#xff09;、绿色&#xff08;Green&a…

Linux系统基础-文件系统

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-文件系统 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 回顾C语言…

RabbitMQ进阶_可靠性

文章目录 一、 发送者的可靠性1.1、 生产者重试机制1.2、 生产者确认机制1.2.1、确认机制理论1.2.2、确认机制实现1.2.2.1、定义ReturnCallback1.2.2.2、定义ConfirmCallback 二、 MQ的可靠性2.1、 数据持久化2.1.1、 交换机持久化2.1.2、 队列持久化2.1.3、 消息持久化 2.2、 …

R语言机器学习算法实战系列(四)随机森林算法+SHAP值 (Random Forest)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述特征选择数据切割调节参数构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性模型解释保…

C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

MinIO快速入门:开启你的文件存储之旅

在现代应用中&#xff0c;文件存储服务是至关重要的组件之一。像腾讯云的COS&#xff08;对象存储服务&#xff09;等云存储服务提供了丰富的功能&#xff0c;但随之而来的云端费用也是开发者无法忽视的问题。本文将介绍一款开源、高性能的对象存储服务——MinIO&#xff0c;它…

【含开题报告+文档+PPT+源码】基于SSM框架的诗词吟诵知识学习系统的设计与实现

开题报告 随着信息技术的迅猛发展和互联网的普及&#xff0c;在线教育逐渐成为现代教育的重要形式。在线学习平台以其便捷性、灵活性和个性化等特点&#xff0c;受到广大师生的青睐。特别是在线吟诵知识学习&#xff0c;已经成为许多学生提升自我修养、陶冶情操的重要途径。青…