昊虹AI笔记网

 找回密码
 立即注册
搜索
查看: 1076|回复: 0
收起左侧

为什么引用传递的参数名前通常都用const作了修饰?

[复制链接]

249

主题

252

帖子

976

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
976
昊虹君 发表于 2022-10-26 10:35 | 显示全部楼层 |阅读模式
阅读本文之前建议大家先阅读下面这篇文章:
C/C++函数参数传递时值传递、指针传递、引用传递的区别是什么?

这篇文章说说“为什么引用传递的参数名前通常都用const作了修饰?”

const 修饰变量时表明该变量的值不可被改变。

如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const修饰。
例如不要将函数void Func1(int x) 写成void Func1(const int x)。
同理不要将函数void Func2(A a) 写成void Func2(const A a),其中A为用户自定义的数据类型。

对于非内部数据类型的参数而言,像void Func(A a) 这样声明的函数注定效率比较底。因为函数体内将产生A类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。
为了提高效率,可以将函数声明改为引用传递的形式,即void Func(A &a),因为“引用传递”仅借用一下参数的别名而已,实参和形参共享对应的数据存储空间,不需要产生临时对象。
但是函数void Func(A &a) 存在一个缺点:
“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为void Func(const A &a)。

那么是否应将void Func(int x) 改写为void Func(const int &x),以便提高效率呢?
完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|昊虹AI笔记网 ( 蜀ICP备2024076726 )

GMT+8, 2024-9-8 13:06 , Processed in 0.020214 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表