C 中傳值引數和引用引數和指標怎樣區別?

2021-05-23 10:14:31 字數 1527 閱讀 7521

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時,每...