C++ const和&在函数参数中的含义

知识点小结

C++中有的函数参数会用const来传递,同时配合&引用符号一起使用,形式如  void form(const int &a)。一开始并不懂其中深意,后来查了一下,发现这种用法和值传递的效果是一样的。但是因为引用的效率较高,所以在参数是复杂的数据类型的时候,采用这种常量引用的方法。这样既使用了引用,又使用const限制了对参数的修改。

1. 首先需要注意的是,常量引用可以达到和值传递相同的效果。

2. 常量引用从效果上杜绝了在被调用函数内部对传入的参数进行人为修改的情况。

3. 值传递会对参数进行一个完全的拷贝,修改不影响原值,但效率不高。

具体代码如下图所示:

#include <iostream>
using namespace std;
 

// 不能够改变a和b的值
int constsum(const int &a, const int &b)
{
  int c = a + b;
  return c;
}

// 可以改变a和b的值,在局部范围内。
int sum(int a, int b)
{
  int c = a + b;
  return c;
}
 
int main()
{
  int a = 1;
  int b = 2;
  int c = constsum(a, b);
  int d = sum(a, b);
  cout << "The result of constSum is: " << c << endl;
  cout << "The reuslt of sum is: " << d << endl;
  return 0;
}

上面的计算结果当然都是1 + 2 = 3了,如下图。

The result of constSum is: 3
The reuslt of sum is: 3

以上意图说明通过const配合引用符号&是可以达到值传递相同的传参效果的。下面我们就可以开始搞搞破坏,做点不规矩的事儿,来凸显两种方法的差别,以及我们为什么要选用更加复杂的const的形式。在下面的代码中,做了一点点小的改动,在sum函数中修改了a的值,这个操作在constsum中是无法做到的(当然这个操作不太规矩,我们当然希望传入的参数不被函数修改。)

#include <iostream>
using namespace std;
 
 // 不能够改变a和b的值
int constsum(const int &a, const int &b)
{
  int c = a + b;
  return c;
}
// 可以改变a和b的值,在局部范围内。
int sum(int a, int b)
{
  a = 10;
  int c = a + b;
  cout << "a in sum function is: " << a << endl;
  return c;
}
 
int main()
{
  int a = 1;
  int b = 2;
  int c = constsum(a, b);
  int d = sum(a, b);
  cout << "The result of constSum is: " << c << endl;
  cout << "The reuslt of sum is: " << d << endl;
  cout << "a in main function is: " << a << endl;
  return 0;
}

以上的结果如下:

a in sum function is: 10
The result of constSum is: 3
The reuslt of sum is: 12
a in main function is: 1

不出意料的,我们不规矩的举动没有被编译器察觉。由此看来,常量引用的方法还是很有必要的,从效果上杜绝了在被调用函数内部对传入的参数进行人为修改的情况。不过我们不妨挖掘的深入一些,为什么一般的值传递参数可以被修改,而常量引用的方式既不能被修改,效率又比较高呢?

首先值传递的传参方式是将传入的参数复制到一个新的存储空间当中,相当于一个copy,所以可以对其进行任意的修改而又不影响其原来的值(可以参考上面a变量在sum函数中个主函数中分别有不同的值)。而这种复制在遇到一般的数据类型时性能上还差别不大,遇到一些自定义的复杂的数据类型,结构体时,完全拷贝的方式时间和空间性能都不佳。所以首先想到了引用&,用&符号免去了完全拷贝这一过程,如果修改的话原来的值也会被修改。效率提升了,但是原值被修改是不能接受的,不能我调用一个函数,原来的变量值都变了。所以,就用const进行了限制。这就是为什么要用常量引用的方式原因。

 

  • 20
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值