c++中傳值引數和引用引數怎樣區別呢?
看以下例子:
#include
using namespace std;
void swap(int a,int b)
main()
{int a=3,b=5;
cout<< "before 『swap』:a="<
using namespace std;
void swap(int & a,int &b)
{int temp;
temp=a;
a=b;
b=temp;
cout<<"in 『swap』:a="《指標方式和引用方式都屬於傳址呼叫。那麼指標和引用又有什麼樣的區別呢?
兩種引數都允許函式修改實參所對應的物件,兩種型別的引數都允許有效得向函式傳遞大型類物件。
兩者在引數傳遞過程中,有如下幾點不同
(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;
C 值引數和引用引數
未用ref或out修飾符宣告的引數為值引數。使用值引數,通過將實參的值複製到形參的方式,把資料傳遞到方法。方法被呼叫時,系統做如下操作。值引數的實參不一定是變數。它可以是任何能計算成相應資料型別的表示式。看乙個例子 float func1 float val 宣告方法 下面來呼叫方法 float f...
C 值引數 引用引數和輸出引數
一 值引數 在使用引數時,是把乙個值傳遞給函式使用的乙個變數。對函式中此變數的任何修改都不會影響函式呼叫中指定的引數。由於函式只有乙個返回值,不能用作引數的多個變數值 二 引用引數 即函式處理的變數與函式呼叫中使用的變數相同,而不僅僅是值相同的變數。因此,對這個變數的任何改變都會影響用作引數的變數值...
Scala 傳名引數和傳值引數
1 package com.atguigu.chapter0423 object controlabstraction 10 f0 23 11 def f1 int 15f0 f1 1617 2.傳名引數 傳遞 塊 a int 塊的返回值是int型別的 我們可以看到 當f1作為乙個 塊傳入f2時,每...