在編寫個人函式的時候,你將會受到c++
中的一條基本的原則的限制:在預設的情況下,變數只能以值傳遞的方式傳遞給函式。這句話的意思是:被傳遞到函式的只是變數的值,永遠不是變數的本身。
例如:void changevar(int myvar,int newvalue)
int main()
結果為 20;
出現這種情況的原因是:在呼叫changevar
()函式時,程式只是把
main
()函式中的
mynum
變數的值賦值給了
changevar
()函式中的
myvar
變數,它們是兩個不同的變數。事實上,
changevar
()函式完全不知道在
main
()函式中還存在乙個
mynum
的變數,甚至連它的名字都不知道。
解決方法:
通過使用位址和指標
繞開「值傳遞
」問題的第乙個方法是向函式傳遞變數的位址而不是它的值。
int main()
當然,changevar
()函式也要相應的改動。
void changevar(int* myvar,int newvalue)
現在可以得到預期的結果90了。
這種交換在很多的排序演算法裡都要用到。
以「引用傳遞
」方式向函式傳遞引數
既然像這樣使用位址是一種很好的思路,讓這個概念更加完善豈不是更好?如果事先知道某個函式只能接受乙個位址,能不能按照某種套路來編寫有關的**以便在呼叫該函式時不需要使用特殊的語法呢?
引入引用傳遞方式輸入引數。
int a = 100;
int& b = a;
b = 1000;
考察: (1)&a與&b
的關係?
(2) a=?
b現在是
a的乙個別名!
a=1000;
1)引用必須在宣告時立即初始化,不允許空引用
2)引用一旦初始化,就不能再引用其它資料
3)引用和被引用的變數實際上代表同乙個記憶體的資料
傳遞函式的引數和返回值.c++
中常用的方式有三種
值傳遞,
指標傳遞和引用傳遞
引用傳遞的性質象指標傳遞,
書寫形式象值傳遞,
理由:如果只需要借用一下別名
,就沒必要用指標,.
void changevar(int &myvar,int newvalue);
這個函式第乙個輸入的引數不是乙個指標,它是那個將被傳遞給這個函式的原始變數的乙個別名。在changevar
()函式裡對這個引數變數進行的任何操作都將反映在
changevar
()函式外的那個原始變數身上。這意味著
changevar
()函式與原來的一樣。
void changevar(int myvar,int newvalue){
myvar=newvalue;
這使得這個函式更容易被呼叫----
只需要提供乙個變數名;
int main(){
int mynum=20;
changevar(mynum,90);
這比值傳參語法上更簡單了。
以「引用傳遞」方式把引數值傳遞給乙個函式是
c++的新增功能,這可以讓函式的呼叫語法更加簡單清晰。
引用傳遞
」方式而不是以
「值傳遞
」方式返回: int &myfuntion();
2.除了可以改變有關變數的值,「
引用傳遞
」方式的另乙個好處是它的開銷相對要小一些:因為不需要在函式裡建立臨時變數來容納那些值,程式的記憶體佔用量當然會小一些。
3.如果想獲得「
引用傳遞
」方式帶來的效能改善,但不想改變某個變數的值,可以把相應的輸入引數定義為乙個常量:
void myfunc(const int &mynum);
通過這樣定義的函式,可以把具體的引數直接傳遞給它:myfunc(7);
C 引用型別作為函式引數時
在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...
C 引用型別作為函式引數時
在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...
C 引用型別作為函式引數時
在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...