C++ 中的常量引用与普通参数传递
本文将讨论 const 引用和普通参数传递之间的区别。
为了更好地理解 const 引用,我们首先要了解按值传递、按引用传递和按 const 引用传递之间的区别。
在 C++ 中按值传递
在传递参数值之前,编译器使用虚拟变量创建其内存的副本,并传递其值。
#include <bits/stdc++.h>
using namespace std;
void fun(int num){
num = num + 10;
}
int main()
{
int n = 30;
fun(n);
cout << n << endl;
}
输出:
30
当参数 n
通过 fun()
函数时,编译器在 n
中创建内存副本。由于它是一个副本,所以函数不会修改 n
的原始值。
在这里,我们遇到两个缺点。我们无法更改它的值,并且创建了参数的副本,浪费了内存。
在 C++ 中通过引用传递
这种方法消除了按值传递方法的缺点。我们不是创建一个虚拟参数并传递它的值,而是传递变量的别名。
因此,不会浪费内存,并且由于传递了变量的别名,因此对函数中变量所做的任何更改都会得到反映。
#include <bits/stdc++.h>
using namespace std;
void fun(int &num){
num = num + 10;
}
int main()
{
int n = 30;
fun(n);
cout << n << endl;
}
n
的值在这里受到影响。
40
在 C++ 中使用常量引用传递
现在,当我们不想浪费任何内存并且不更改变量的值时,我们可以使用 const 引用。
#include <bits/stdc++.h>
using namespace std;
void fun(const int &num){
num = num + 10;
}
int main()
{
int n = 30;
fun(n);
cout << n << endl;
}
上面的代码将抛出编译错误,因为 num = num +10
作为 const 引用传递。因为是 const,所以参数变成只读的,不能改变 num
的值。
输出:
[Error] assignment of read-only reference 'num'
虽然我们提到当引用为 const 引用时参数的值不能改变,但还是有一些微妙但至关重要的区别。
如果一个参数是一个 const
引用,但传递的参数是 not const
,那么在函数调用期间参数的值可能会改变。
#include <bits/stdc++.h>
using namespace std;
void fun(const int &n)
{
const_cast<int&>(n) = 40;
}
int main()
{
int n = 30;
fun(n);
cout << n << endl;
}
我们观察到虽然传递的参数不是 const。函数 fun
可以在 cast 的帮助下改变它的值。
输出:
40
当使用 const 引用传递参数时,它包括取消引用的额外成本。最差的引用位置和编译器优化的机会几乎为零。
概括
语法 - 按值传递:
double fun(vector<double> my_vector); //pass by value
这里的底层对象或向量是使用其复制构造函数复制的。新对象分配了额外的内存,所有值和子对象都被单独复制和存储。
所以上面的函数将复制向量并对该向量的副本而不是原始向量本身进行更改。如果传递的对象或向量很大,则复制过程将变得非常繁琐,浪费我们的存储和 CPU 周期。
语法 - 通过引用传递:
double fun(vector<double> &my_vector); //pass by reference
底层向量没有被复制,并且传递了向量本身的内存地址,因此函数所做的更改将直接对原始向量进行。
这节省了内存和 CPU 周期
,因为没有分配新的内存,也没有调用(昂贵的)复制构造函数。
语法 - 通过常量引用传递:
double fun(const vector<double> &my_vector); //pass by const reference
上面的语法类似于通过引用传递,唯一的区别是我们不能修改基础值。这解决了不复制和不修改我们对象的值的问题。
这里的引用符号 (&
) 表示向量不应被复制,关键字 const 使我们的向量不可修改,即只读。
相关文章
在 C++ 中通过掷骰子生成随机值
发布时间:2023/04/09 浏览次数:169 分类:C++
-
本文解释了如何使用时间因子方法和模拟 C++ 中的掷骰子的任意数方法生成随机数。了解它是如何工作的以及它包含哪些缺点。提供了一个 C++ 程序来演示伪数生成器。
在 C++ 中使用模板的链表
发布时间:2023/04/09 浏览次数:158 分类:C++
-
本文解释了使用模板在 C++ 中创建链表所涉及的各个步骤。工作程序演示了一个链表,该链表使用模板来避免在创建新变量时声明数据类型的需要。
在 C++ 中添加定时延迟
发布时间:2023/04/09 浏览次数:142 分类:C++
-
本教程将为你提供有关在 C++ 程序中添加定时延迟的简要指南。这可以使用 C++ 库为我们提供的一些函数以多种方式完成。
在 C++ 中创建查找表
发布时间:2023/04/09 浏览次数:155 分类:C++
-
本文重点介绍如何创建查找表及其在不同场景中的用途。提供了三个代码示例以使理解更容易,并附有代码片段以详细了解代码。
如何在 C++ 中把字符串转换为小写
发布时间:2023/04/09 浏览次数:63 分类:C++
-
介绍了如何将 C++ std::string 转换为小写的方法。当我们在考虑 C++ 中的字符串转换方法时,首先要问自己的是我的输入字符串有什么样的编码
如何在 C++ 中确定一个字符串是否是数字
发布时间:2023/04/09 浏览次数:163 分类:C++
-
本文介绍了如何检查给定的 C++ 字符串是否是数字。在我们深入研究之前,需要注意的是,以下方法只与单字节字符串和十进制整数兼容。
如何在 c++ 中查找字符串中的子字符串
发布时间:2023/04/09 浏览次数:65 分类:C++
-
本文介绍了在 C++ 中检查一个字符串是否包含子字符串的多种方法。使用 find 方法在 C++ 中查找字符串中的子字符串
如何在 C++ 中把字符串转换为 Char 数组
发布时间:2023/04/09 浏览次数:107 分类:C++
-
本文介绍了在 C++ 中把字符串转换为 char 数组的多种方法。使用 std::basic_string::c_str 方法将字符串转换为 char 数组