C++ Primer阅读笔记--const限定符的使用

2023-11-03

1--知识点

① const 对象必须初始化:

const 对象一旦创建后其值不能再改变,因此 const 对象必须初始化;

const int k; // 错误,未被初始化
const int j = 42; // 正确,const对象被初始化

② const 对象的共享:

const 对象被设定为仅在定义的文件内有效,当在多个文件之间共享 const 对象时,需在变量的定义前添加 extern 关键字;

// 假设file1.cc中定义并初始化了以下常量,则该常量能被其他文件所访问
extern const int bufSize = fcn();

// 假设以下file1.h头文件声明了一个常量,则其与file1.h中的bufSize是同一个
extern const int bufSize;

③ const 的引用:

将引用绑定到 const 对象中,称为对常量的引用,即对 const 的引用称为对常量的引用;

对常量的引用不能被用作修改它所绑定的对象;

④ const 和指针:

        指向常量的指针(黑马教程称为常量指针):

const double pi = 3.14;
const double *cptr = π // cptr为一个指向常量的指针

指向常量的指针:指针指向的值不可修改,即*cptr不能修改;而指针的值可以修改,即cptr可以修改,从而指向不同的对象;

        常量指针(黑马教程称为指针常量):

int errNumb = 0;
int *const curErr = &errNumb;

常量指针:指针指向的值可以修改,即*curErr可以修改;而指针的值不能修改,即curErr不能修改;

        指向常量的常量指针:

const double pi = 3.14;
const double *const pip = π

指向常量的常量指针:指针指向的值和指针的值均不能修改!

⑤ 顶层 const 和底层 const 的概念:

顶层 const:表示指针的值是一个常量;

底层 const:表示指针指向的对象是一个常量;

⑥ constexpr和常量表达式:
        常量表达式:值不会改变,在编译过程中就能得到计算结果的表达式;

用常量表达式初始化的 const 对象也是常量表达式,例如:

const int A = 20; // A是一个常量表达式

const int B = A + 1; // B也是一个常量表达式;

常量表达式由数据类型和初始值共同决定:

const int A = 20; // A是一个常量表达式

int B = 27; // B不是一个常量表达式

        constexpr 变量:C++11新标准允许将变量声明为 constexpr 类型,以便由编译器来验证变量的值是否是一个常量表达式;

声明为 constexpr 的变量一定是一个常量,必须用常量表达式进行初始化;

C++新标准允许定义一种特殊的 constexpr 函数,其足够简单以使编译阶段就能计算结果;可以用 constexpr 的函数去初始化 constexpr 的变量;

constexpr int mf = 20; // 20是常量表达式
constexpr int limit = mf + 1; // mf + 1是常量表达式

constexpr int sz = size(); // 只有当 size 是一个 constexpr 函数时,其是一条正确的声明语句;

一个 constexpr 指针的初始值必须是 nullptr 或 0,或者是存储于某个固定地址中的对象;

在 constexpr 声明中如果定义了一个指针,则限定符 constexpr 仅对指针有效,与指针所指的对象无关;

const int *p = nullptr; // p是一个指向整型常量的指针(即*p不可变,p可变)
constexpr int *q = nullptr; // q是一个指向整数的常量指针(即*q可变, q不可变)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Primer阅读笔记--const限定符的使用 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • Lerna包管理

    认识lerna 导读 本章节主要讲解Lerna是什么 Lerna有什么用 如何使用Lerna进行npm包管理 大厂的Lerna版本管理策略是怎么做的 Lerna是如何实现本地包依赖管理以及底层原理是什么 读者可以带着这些问题去阅读 使学习事
  • 利用jni将Eclipse与C++、Opencv无缝连接

    利用jni将Eclipse与C Opencv无缝连接 博主 w风的季节 日期 2018 4 11 现在越来越多的大学生实验室或者创新项目需要用到将JAVA与C 之间的混合编程 因此本篇就来讲解一下Eclipse中用java写的APP如何将C
  • Spring Boot favicon.ico自定义设置

    做网页的都知道 网页打开后几乎都会有一个favicn的小图标 但是在spring boot中如何设置呢 下面告诉大家一个自定制的方法 非常简单 1 在配置application properties中加入 spring mvc favico
  • 信息熵,信息增益

    信息熵 信息增益 概要 实例一 实例二 概要 信息增益表示得知特征A的信息而使得类Z的信息的不确定性减少的程度 特征A对数据集D的信息增益 G D A 定义为集合的信息熵 H D 与特征A给定条件下D的信息条件熵 H D A 之差 即公式为
  • 机器学习入门-提取文章的主题词 1.jieba.analyse.extract_tags(提取主题词)

    1 jieba analyse extract tags text text必须是一连串的字符串才可以 第一步 进行语料库的读取 第二步 进行分词操作 第三步 载入停用词 同时对分词后的语料库进行停用词的去除 第四步 选取一段文本分词列表
  • 关于ASP.NET邮件发送的学习心得

    ASP net邮件发送是一种非常常见的功能 它可以让我们在网站中实现发送邮件的功能 比如用户注册成功后发送欢迎邮件 或者是找回密码时发送重置密码邮件等等 在学习ASP net邮件发送的过程中 我总结了以下几点心得 一 SMTP服务器的配置
  • 【解决问题】Transaction was marked for rollback only; cannot commit

    问题现象 导入文件的时候直接报错 Transaction was marked for rollback only cannot commit nested exception is org hibernate TransactionExc
  • JavaScript运算符详解

    JavaScript运算符详解 目录 JavaScript运算符详解 1 算术运算符 1 1 加法运算符 1 1 1 基本运算规则 1 1 2 对象的相加 1 2 余数运算符 1 3 自增和自减运算符 1 4 正负数值运算符 1 5 指数运
  • C单元测试框架——CMockery (3)中文手册

    Cmockery 单元测试框架 翻译的匆忙 没有校验 纰漏之处感谢请指正 转载请注明来自 see see 版权归原文 所有 Cmockery 是一个轻量级的库 作者用它来做C单元测试 目录 动机 概述 执行测试 异常处理 出错处理 断言 断
  • 河南省历年高考人数(2004-2021)

    一年一度高考时 我的高考已经过去15年了 河南高考人数创了新高 搜了一下历年人数 自己画了一个图
  • 前端XMLHttpRequest发送请求

    export function filePreview fileName ftpDownloadPath departmentId let mockXHR new XMLHttpRequest mockXHR open post baseU
  • python中的is None和==None

    1 python代码if not x 和if x is not None 和if not x is None 使用 2 python 中None is 和 的深入探讨 3 Python中为什么要用 is None 来代替 None
  • 服务器怎么设置虚拟网卡,VMWare虚拟网卡配置

    VMWare提供了三种工作模式 它们是bridged 桥接模式 NAT 网络地址转换模式 和host only 主机模式 要想在网络管理和维护中合理应用它们 你就应该先了解一下这三种工作模式 1 bridged 桥接模式 在这种模式下 VM
  • 计算机网路实验三 TCP和UDP协议分析

    计算机网路实验三 TCP和UDP协议分析 一 实验目的及任务 1 熟悉TCP UDP的协议基本原理 2 利用Wireshark对TCP和UDP进行协议分析 二 实验环境 与因特网连接的计算机网络系统 操作系统为windows Wiresha
  • EGL Error : Could not create the egl surface: error = 0x3003

    这个错误一般是屏幕位深参数不正确导致的 修改屏幕对应的fb参数即可 16 24 32等 echo 16 gt sys class graphics fb0 bits per pixel 这里我的屏幕对应的是fb0 如果是屏和fb不对应 也可
  • 通过C#代码实现开启摄像头,截图,录像等功能

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks using Sys
  • 详解 Solidity 事件Event

    很多同学对Solidity 中的Event有疑问 这篇文章就来详细的看看Solidity 中Event到底有什么用 写在前面 Solidity 是以太坊智能合约编程语言 阅读本文前 你应该对以太坊 智能合约有所了解 如果你还不了解 建议你先
  • uni push2.0实现消息推送(在线&离线)

    uni push2 0配置 需要开通uniCloud服务 推荐阿里云 生成证书 安卓 https ask dcloud net cn article 68 ios https docs getui com getui mobile ios
  • Python兼职这么火,千万别被骗了,这里整理了一份兼职要点,搞副业不踩坑!

    程序开发领域有这样一句话 人生苦短 我用Python 这本是开发者大佬Bruce Eckel的金句 Life is short you need Python 有趣的是 很多人并非专职程序员 但却把这句话奉为神谕 所以Python究竟有什么
  • C++ Primer阅读笔记--const限定符的使用

    1 知识点 const 对象必须初始化 const 对象一旦创建后其值不能再改变 因此 const 对象必须初始化 const int k 错误 未被初始化 const int j 42 正确 const对象被初始化 const 对象的共享