從編程思想的角度討論引用機制的作用
注:這里的代碼不對應(yīng)任何編程語言
何謂引用?
在Java和C++等高級語言中,一個引用是一個變量或其他對象的別名,它在聲明時就唯一綁定了。
int a;int &b = a;
有了以上定義,對引用b的操作就是對變量a的操作,而引用b是不能再作為其他對象的別名,事實上C++編譯器就將引用作為const指針處理。
引用有效地避免了濫用指針帶來的安全隱患,當然引用也可作為函數(shù)參數(shù)、函數(shù)返回值、const引用可指向字面值常量等等,引用幾乎和指針一樣功能強大。
函數(shù)參數(shù)的值傳遞與引用傳遞
值傳遞和引用傳遞是函數(shù)傳參調(diào)用的兩種實質(zhì)方式,C語言函數(shù)傳參采用的就是值傳遞的形式。Java、C++、Python等新的語言都在提函數(shù)參數(shù)的引用傳遞這種形式,即實參會隨形參變。
由函數(shù)調(diào)用來確定參數(shù)傳遞形式的思想
目前,大多數(shù)高級語言函數(shù)在定義后已經(jīng)確定好了參數(shù)的值傳遞還是引用傳遞,在函數(shù)調(diào)用時是不能變的?,F(xiàn)在,代碼的重復(fù)利用被越來越重視起來了,自然就少不了對函數(shù)調(diào)用的研究。
函數(shù)一般都可以看作一種計算,同樣的計算可能會被應(yīng)用于多個對象,而每個對象自身值是否改變的要求又不一樣。現(xiàn)在來做具體探究
void fun(int);int a = 5, b = 10;
定義好了函數(shù)fun,變量a和b,要求a傳參后不變,b傳參后隨fun改變。
1.函數(shù)定義好了就確定了傳參形式會怎么樣?
如果是值傳遞,a傳參沒問題,但是滿足不了b傳參要求。要么針對b傳參構(gòu)造一個函數(shù)fun2,要么利用指針改進fun,就展示下改進的fun函數(shù)的調(diào)用
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.靈魂之問:由函數(shù)的調(diào)用來確定傳參會怎么樣?
int a = 5, b = 10;fun(a); ? //假定這種調(diào)用是值傳遞fun(b&); ?//假定這種調(diào)用是引用傳遞
這就相當直觀了,代碼也十分簡潔。完全可以這么理解傳參,值傳遞就是把實參復(fù)制一個副本來用,被調(diào)函數(shù)只改變參數(shù)副本,實參本身并不變;引用傳遞是被調(diào)函數(shù)就是在用實參本身,故原實參會隨被調(diào)函數(shù)變化。由調(diào)用確定傳參的原理就是:傳值調(diào)用就讓函數(shù)使用實參副本,傳引用調(diào)用就讓函數(shù)使用實參本身。
再來看下當函數(shù)有兩個參數(shù)時,調(diào)用確定傳參有什么優(yōu)勢?
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都能變
我們發(fā)現(xiàn)這樣一個函數(shù)竟然有了四種調(diào)用形式,一種計算輕易做到多種結(jié)果,可見這種機制對于編程是十分靈活的。所以,調(diào)用確定傳參的思想對于程序設(shè)計的靈活性以及代碼的復(fù)用性的優(yōu)勢是極大的。
本文重點:調(diào)用定傳參的編程思想
原文出處:從編程思想的角度討論引用機制的作用 - 自導者薄空的文章 - 知乎 https://zhuanlan.zhihu.com/p/612827775