【转载】C ++ 基础 指针 引用
基礎不扎實 >_<!
C++中傳值參數和引用參數怎樣區別呢?
看以下例子:
#include<iostream>
using namespace std;
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
main()
{
int a=3,b=5;
cout<< "before ‘swap’:a="<<a<<",b="<<b<<endl;
swap(a,b);
cout<<"after??‘swap’:a="<<a<<",b="<<b<<endl;
}
這個例子是傳值調用, 意思就是 形參 的 改變不會影響 實參的值。
你運行一下可知 主函數調用了swap函數后 a,b的值并沒有發生交換。
原因是,調用swap函數時 編譯器為 swap(int a,int b) 中的形參 a , b單獨分配內存空間,并接受主函數傳遞來的值,這塊內存空間和 main()函數中的 a ,b 不是同一內存空間。 所以在swap(int a,int b) 中 a , b發生了交換,但main函數中a , b沒發生交換。即主調函數與被調函數的操作對象各不相同,參數僅在調用時由實參向形參傳遞,而不可由形參向實參傳遞。
要使a ,b發生交換 需要使用傳址調用。程序改為如下:
#include<iostream>
using namespace std;
void swap(int?&?a,int?&b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<"in ‘swap’:a="<<a<<",b="<<b<<endl;
}
??main()
{
int a=3,b=5;
cout<< "before ‘swap’:a="<<a<<",b="<<b<<endl;
swap(a,b);
cout<<"after??‘swap’:a="<<a<<",b="<<b<<endl;
}
引用可以看作是一個變量的別名,使用 引用 時 ,對于void swap(int a,int b)???編譯器并沒有給形參a,b分配新的內存空間,只是使形參a,b指向了main函數中實參a,b的內存空間,他們共享同一內空間,即把地址給了形參。所以在void swap(int a,int b)函數中對這塊內存的改變也就改變了實參的值。
除了使用引用,也可以使用指針。
指針方式和引用方式都屬于傳址調用。那么指針和引用又有什么樣的區別呢?
兩種參數都允許函數修改實參所對應的對象,兩種類型的參數都允許有效得向函數傳遞大型類對象。
兩者在參數傳遞過程中,有如下幾點不同
???(1)引用必須被初始化為指向一個對象,一旦初始化了,它就不能在指向其它對象。指針可以指向一系列不同的對象,當然也可以定義為NULL;
???如:
| ?calss Type{ ???void operation(const Type&p1,const Type&p2); ???int main(){ ????Tyoe obj1; ????Type obj2 = operation(obj1,0);????//引用參數的實參不能為0 ???} |
???所以在函數中,一個參數可能指向不同的對象的情況,或者這個參數可能不指向任何對象,則必須實用指針參數。
???(2)引用參數的一個重要用法,它允許我們在有效實現重載操作符的還能保證用法的直觀性。如下例:
| ??Matrix operator+(Matrix m1,Matrix m2) ???{ ????Matrix result; ????//do computation ????return result; ???} |
???通過上面實現后,就能夠支持兩個Matrix對象的加法,如:a+b
???但是這樣做,效率會非常低。因為該實現的實參是按值傳遞,兩個Matrix對象相加的時候,內容被拷貝到operator+()函數的參數區中,因為Matrix對象非常大的時候,分配這樣一個對象,并把它拷貝到函數參數區中的時間和空間開銷比較高。
???而為了提高我們的操作符函數的效率,假定我們決定把參數申明為指針的時候,如下:
| ?Matrix operator+(Matrix *m1,Matrix *m2) ???{ ????Matrix result; ????//do computation ????return result; ???} |
???這種做法,在一定程度上很好得解決了函數實現的效率問題,但是帶來一個新的問題是用戶的使用習慣,對于這樣的operator+操作,調用方式變為:&a+&b,這樣大大顛覆了我們傳統的調用方式。
???所以這時候,如果申明為引用的方式,就能到達到效率和使用習慣的目的:
| ?Matrix operator+(Matrix &m1,Matrix &m2) ???{ ????Matrix result; ????//do computation ????return result; ???} |
?
?
轉載于:https://www.cnblogs.com/uniquews/archive/2012/02/23/2364388.html
總結
以上是生活随笔為你收集整理的【转载】C ++ 基础 指针 引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑马程序员----银行业务调度系统面试题
- 下一篇: pku 1573 Robot Motio