欢迎光临散文网 会员登陆 & 注册

从编程思想的角度讨论引用机制的作用

2023-04-05 18:22 作者:暇时薄空  | 我要投稿

注:这里的代码不对应任何编程语言

何谓引用?

在Java和C++等高级语言中,一个引用是一个变量或其他对象的别名,它在声明时就唯一绑定了。

int a;int &b = a;

有了以上定义,对引用b的操作就是对变量a的操作,而引用b是不能再作为其他对象的别名,事实上C++编译器就将引用作为const指针处理。

引用有效地避免了滥用指针带来的安全隐患,当然引用也可作为函数参数、函数返回值、const引用可指向字面值常量等等,引用几乎和指针一样功能强大。

函数参数的值传递与引用传递

值传递和引用传递是函数传参调用的两种实质方式,C语言函数传参采用的就是值传递的形式。Java、C++、Python等新的语言都在提函数参数的引用传递这种形式,即实参会随形参变。

由函数调用来确定参数传递形式的思想

目前,大多数高级语言函数在定义后已经确定好了参数的值传递还是引用传递,在函数调用时是不能变的。现在,代码的重复利用被越来越重视起来了,自然就少不了对函数调用的研究。

函数一般都可以看作一种计算,同样的计算可能会被应用于多个对象,而每个对象自身值是否改变的要求又不一样。现在来做具体探究

void fun(int);int a = 5, b = 10;

定义好了函数fun,变量a和b,要求a传参后不变,b传参后随fun改变。

1.函数定义好了就确定了传参形式会怎么样?

如果是值传递,a传参没问题,但是满足不了b传参要求。要么针对b传参构造一个函数fun2,要么利用指针改进fun,就展示下改进的fun函数的调用

void fun(int *);int a = 5, b = 10;int c = a;fun(&c);fun(&b);

虽然能解决问题,但代码就有点难看了。

那如果是引用传递呢?

int a = 5, b = 10;int c = a;fun(c);fun(b);

其实和用指针改进差不多。。

2.灵魂之问:由函数的调用来确定传参会怎么样?

int a = 5, b = 10;fun(a);   //假定这种调用是值传递fun(b&);  //假定这种调用是引用传递

这就相当直观了,代码也十分简洁。完全可以这么理解传参,值传递就是把实参复制一个副本来用,被调函数只改变参数副本,实参本身并不变;引用传递是被调函数就是在用实参本身,故原实参会随被调函数变化。由调用确定传参的原理就是:传值调用就让函数使用实参副本,传引用调用就让函数使用实参本身。

再来看下当函数有两个参数时,调用确定传参有什么优势?

void f2(int, float);int a = 100;float x = 3.14;f2(a, x);   a,x都不变f2(a, x&);  只有x能变f2(a&, x);  只有a能变f2(a&, x&); a,x都能变

我们发现这样一个函数竟然有了四种调用形式,一种计算轻易做到多种结果,可见这种机制对于编程是十分灵活的。所以,调用确定传参的思想对于程序设计的灵活性以及代码的复用性的优势是极大的。

本文重点:调用定传参的编程思想


原文出处:从编程思想的角度讨论引用机制的作用 - 自导者薄空的文章 - 知乎 https://zhuanlan.zhihu.com/p/612827775

从编程思想的角度讨论引用机制的作用的评论 (共 条)

分享到微博请遵守国家法律