在編寫個人函數的時候,你將會受到C++中的一條基本的原則的限制:在默認的情況下,變量只能以值傳遞的方式傳遞給函數。這句話的意思是:被傳遞到函數的只是變量的值,永遠不是變量的本身。
例如:
- void changeVar(int myVar,int newValue)
- {
- myVar=newValue;
- }
- int main(){
- int myNum=20;
- changeVar(myNum,90);
- std::cout<<myNum<<endl;
- return 0;
- }
結果為 20;
出現這種情況的原因是:在調用changeVar()函數時,程序只是把main()函數中的myNum變量的值賦值給了changeVar()函數中的myVar變量,它們是兩個不同的變量。事實上,changeVar()函數完全不知道在main()函數中還存在一個myNum的變量,甚至連它的名字都不知道。
解決方法:
通過使用地址和指針
繞開“值傳遞”問題的第一個方法是向函數傳遞變量的地址而不是它的值。
- int main()
- {
- int myNum=20;
- changeVar(&myNum,90);
- }
當然,changeVar()函數也要相應的改動。
- void changeVar(int* myVar,int newValue){
- *myVar=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++的新增功能,這可以讓函數的調用語法更加簡單清晰。
提示:1.在定義函數時,還可以讓它以“引用傳遞”方式而不是以“值傳遞”方式返回: int &myFuntion();
2.除了可以改變有關變量的值,“引用傳遞”方式的另一個好處是它的開銷相對要小一些:因為不需要在函數里創建臨時變量來容納那些值,程序的內存占用量當然會小一些。
3.如果想獲得“引用傳遞”方式帶來的性能改善,但不想改變某個變量的值,可以把相應的輸入參數定義為一個常量:
void myFunc(const int &myNum);
通過這樣定義的函數,可以把具體的參數直接傳遞給它:myFunc(7);