值参数的常量正确性

2023-12-01

我知道关于 const 正确性的问题很少,其中指出函数的声明及其定义不需要就值参数达成一致。这是因为值参数的常量仅在函数内部重要。这可以:

// header
int func(int i);

// cpp
int func(const int i) {
    return i;
}

这样做真的是最佳实践吗?因为我从来没有见过有人这么做过。我在其他地方看到过这句话(不确定来源):

“事实上,对于编译器来说,无论是否在值参数前面包含此 const,函数签名都是相同的。”

“避免在函数声明中使用 const 值传递参数。如果不被修改,仍应在同一函数的定义中将参数设置为 const。”

第二段说不要将 const 放在声明中。我认为这是因为值参数的常量作为接口定义的一部分是没有意义的。这是一个实施细节。

基于这个建议,对于指针参数的指针值是否也有建议? (它对引用参数没有意义,因为您无法重新分配引用。)

// header
int func1(int* i);
int func2(int* i);

// cpp
int func1(int* i) {
    int x = 0;

    *i = 3; // compiles without error
    i = &x; // compiles without error

    return *i;
}
int func2(int* const i) {
    int x = 0;

    *i = 3; // compiles without error
    i = &x; // compile error

    return *i;
}

Summary:设置值参数对于捕获一些逻辑错误很有用。这是最佳实践吗?您是否会极端地将 const 排除在头文件之外?它与 const 指针值一样有用吗?为什么或者为什么不?

一些参考:

C++ const 关键字 - 随意使用? 使用“const”作为函数参数

const 值参数何时有用的示例:

bool are_ints_equal(const int i, const int j) {
    if (i = j) { // without the consts this would compile without error
        return true;
    } else {
        return false;
    }
    // return i = j; // I know it can be shortened
}

我对此的看法:

这不是一个坏主意,但问题很小,你的精力最好花在其他事情上。

在您的问题中,您提供了一个很好的示例,说明何时可能会捕获错误,但有时您最终也会做这样的事情:

void foo(const int count /* … */)
{
   int temp = count;  // can't modify count, so we need a copy of it
   ++temp;

   /* … */
}

无论哪种方式,优点和缺点都很小。

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

值参数的常量正确性 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr

随机推荐

  • python用多个键填充搁置对象/字典

    我有一个 4 gram 列表 我想用它来填充字典对象 shevle 对象 I go to work I go there often it is nice being I live in NY I go to work 这样我们就有了类似的
  • Python 中递归调用的 return 语句如何保存中间值?

    正在查看一些与递归调用相关的 python 代码 并注意到 return 语句看起来很有趣 当下一次递归调用的返回语句中没有变量赋值时 递归如何工作 当进行递归调用时 中间求和值没有存储在明显的位置 调试器似乎显示列表每次调用都会减少一 但
  • NLog 内部记录器的编程配置

    任何人都可以帮助 NLog 内部记录器的编程配置吗 我有各种目标 电子邮件目标不发送任何电子邮件 尽管它确实有日志记录规则 所以我希望通过启用内部日志来获得更多见解 但是 我进行了编程配置 但没有找到任何在代码中设置内部记录器的资源 索姆斯
  • 定义一个特定表格单元格的高度

    我有一个带有两个自定义单元格的 tableView 我需要定义一个单元格的高度 但不理会另一个单元格的高度 我正在尝试学习 Objective C 所以任何帮助将不胜感激 在 UITableView 委托中 实现例程 tableView h
  • 如何比较两个数组列表中至少有一个属性不同的相似对象?

    我有两个数组列表 每个都有用户类型的对象列表 User 类如下所示 public class User private long id private String empCode private String firstname priv
  • 将字节数组转换为字符串 (Java)

    我正在 Google app Engine 中编写一个网络应用程序 它允许人们基本上编辑 html 代码 并将其存储为 htmlblobstore 中的文件 我正在使用 fetchData 返回一个byte 文件中的所有字符 我正在尝试打印
  • 将文本数据库分成 N 个相等的块并保留标题

    我有几个大型 30 百万行 文本数据库 我正在使用以下代码清理它们 我需要将文件拆分为 100 万行或更少 并保留标题行 我查看了 chunk 和 itertools 但无法得到明确的解决方案 它用于 arcgis 模型 根据 icyroc
  • 如何设置引导文本的大小和卡片大小

    我使用引导程序实现了该卡 但我的卡片尺寸根据文本字符的数量而变化 详细信息链接也有所不同 当我缩小浏览器时 它会与我的卡片文本重叠 如何固定卡片文字的大小 类 card text 以避免重叠并避免不同的卡片尺寸 div class card
  • 如何愚弄jqXHR始终成功

    我试图让 jQuery 的 ajax 调用总是返回 就像它们成功一样 例如即使没有网络 我也会返回一些本地保存的数据 这可能吗 我尝试使用 ajaxPrefilter 并调用 jqXHR 的成功函数 但它仍然不会表现得好像请求已经完成 Th
  • 这是我的网络应用程序的“记住我”功能的合法实现吗?

    我正在尝试向我的网络应用程序添加 记住我 功能 以使用户在浏览器重新启动之间保持登录状态 我想我已经得到了大部分 我使用谷歌应用程序引擎作为后端 它允许我使用java servlet 这是一些演示的伪代码 public class MySe
  • Docker 网络 Nginx 解析器

    我正在尝试删除配置中已弃用的 Docker 链接 剩下的就是摆脱那些Bad Gateway当我重新创建容器时 nginx 反向代理错误 注意 我在桥接模式下使用 Docker 网络 docker network create nettest
  • 从 sqlite 存储和检索 Uri

    我是一名新手开发人员 目前正在开发一个应用程序 其中部分功能允许用户捕获图像 将其存储在应用程序的文件系统中 并将其引用存储在 SQLite 数据库的列中 然后 用户将能够根据与数据库中关联的任何标准在网格视图中查看这些图像 例如 仅显示特
  • 如何使用 python 3.8.1 将 django 应用程序部署到heroku?

    我正在尝试将 django 应用程序部署到 heroku 安装 django heroku 时出现错误 越来越失败了错误是 从源代码构建 psycopg2 需要 pg config 我也尝试安装psycopg2 它也失败了 我使用的是 Ma
  • 触发电子邮件验证

    我正在使用自定义策略 期望的用户旅程是 用户在屏幕 1 上输入电子邮件 密码 成功验证屏幕 1 后 用户将转到屏幕 2 在屏幕 2 中 用户必须输入发送到其电子邮件的代码 请注意 用户在注册时已经验证了电子邮件 我被困在让 2 人去工作 目
  • PayPal 免费试用期的实施不会返回任何自定义参数

    最近两天一直被这个问题困扰 Scenario 我们有一个基于网络的产品 用户可以免费注册 14 天 之后每月订阅 60 美元 一旦用户点击 使用 Paypal 付款 按钮 页面将把用户带到 Paypal 一旦他们完成付款 它就会重定向回我们
  • 如何在不禁用firewalld(Kubernetes)的情况下使用Flannel

    我是法兰绒和 K8s 的新手 我正在我的 1 个主节点和 2 个节点集群 由 KVM 创建 上使用它们 我使用 flannel 网络插件初始化了集群 然后我发现我无法访问内部 结果发现可能是我的网络或者DNS进程出了问题 下列的https
  • 具有继承列表的自动映射器

    仅供参考 这与这个问题不同自动映射器以及从集合或列表继承 这是我继承的列表 public class MyPagedList
  • 在模拟器中使用 Google 登录按钮时出现问题

    当我单击 Google 登录按钮时 它会显示以下对话框 我单击 更新 但没有任何反应 但我的 logcat 给出了以下输出 01 24 07 38 48 121 W GooglePlayServicesUtil 1305 Google Pl
  • 日期时间差异

    我有2个变量 GMDCOMTM which stores the date time Tue Oct 1 13 32 40 2013 GMDRRSTM which stores the date time Tue Oct 2 23 35 3
  • 值参数的常量正确性

    我知道关于 const 正确性的问题很少 其中指出函数的声明及其定义不需要就值参数达成一致 这是因为值参数的常量仅在函数内部重要 这可以 header int func int i cpp int func const int i retu