欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中引用的使用總結(jié)

 更新時間:2013年10月16日 10:26:31   作者:  
以下是對C++中引用的使用進行了詳細的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助

1引用的定義

引用時C++對C的一個重要的擴充,引用的作用是給變量起一個別名。

例如:

int a;

int &b=a;//聲明b是a的引用

經(jīng)過以上的聲明,b就成為了a的別名,a和b的地位以及作用都是一樣的。

將b聲明為a的引用,不需要再為b開辟新的單元,b和a在內(nèi)存中占同一存儲單元,它們具有相同的地址。

復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int a=10;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int &b=a;//聲明b是a的引用
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cout<<"b="<<b<<endl;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;a=a-5;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cout<<"b="<<b<<endl;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b=b-1;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cout<<"a="<<a<<endl; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return 0;
}


在程序中,

聲明了b是a的引用,然后輸出b=10;

然后使a的值減小5,再輸出b=5,說明b會隨著a的變化做出變化;

然后使b的值減小1,再輸出a=4,說明a會隨著b的變化做出變化。

在聲明一個引用的同時,必須同時對它進行初始化,即聲明它代表哪一個變量。在聲明變量b是變量a的引用后,就可以將b作為a的別名來進行操作,并且b不能再作為其他變量的引用(別名)。

聲明引用,而不進行初始化操作:

復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
         int a=10;
         int &b;             
         return 0;
}

編輯器報錯

========================================

已經(jīng)申明p為a的引用之后,在聲明p為b的引用

復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
         int a=10;
         int &p=a;
   int b=5;
   int &p=b;             
         return 0;
}

編輯器報錯:


注意區(qū)分:

int &b=a;表示b是a的引用

int *b=&a;表示b是指針變量,并且b的值是a的地址

引用不是一種獨立的數(shù)據(jù)類型,必須指定其代表的某一類實體(如變量,類對象),不能定義引用數(shù)組,不能定義指向引用的指針,也不能定義指針的引用。

2 引用作為函數(shù)的參數(shù)

C++增加引用機制,主要是把它作為函數(shù)參數(shù),以擴充函數(shù)傳遞數(shù)據(jù)的功能。

函數(shù)的參數(shù)傳遞有三種情況

將變量名作為形參和實參

這是傳給形參的是變量的值,傳遞是單向的。如果在執(zhí)行被調(diào)用函數(shù)期間,形參的值發(fā)生變化,是不能反映到實參的。因為形參只是復制了實參的數(shù)值,兩變量并不是占用同一存儲單元。

復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
 void change(int x,int y);
 int i=3,j=2;
 change(i,j);
 cout<<i<<endl;
 cout<<j<<endl;
 return 0;
}
void change(int x,int y){
    int z;
    z=x;
    x=y;
    y=z;
}



x復制了i的值,y復制了j的值。但i和j與x和y占不同的存儲單元,因此只改變x和y的值,并不能改變i和j的值。

將變量地址作為實參,指針作為形參

這種方式仍然是值傳遞的方式,不過他傳遞的不是變量的數(shù)值,而是變量的地址。因此可以在被調(diào)用函數(shù)中,通過調(diào)用指針指向的變量來改變相應變量的值。

復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
         void change(int * x,int * y);
         int i=3,j=2;
         change(&i,&j);
         cout<<i<<endl;
         cout<<j<<endl;
         return 0;
}
void change(int * x,int * y){
         int *z;
         z=x;
         x=y;
         y=z;
}



因為是值傳遞,所以只改變指針的值,而不去改變指向的變量的值,還是不能改變相應的變量的值。

復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
         void change(int * x,int * y);
         int i=3,j=2;
         change(&i,&j);
         cout<<i<<endl;
         cout<<j<<endl;
         return 0;
}
void change(int * x,int * y){
         int *z;
         *z=*x;
         *x=*y;
         *y=*z;
}


當改變指針指向的變量的值的時候,相應的變量的數(shù)值也會發(fā)生變化。

將變量名作為實參,引用作為形參

將變量名作為形參和實參和將變量地址作為實參,指針作為形參都是采用的值傳遞的方式。而引用作為形參的時候,采用的是地址傳遞的方式。

復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
 void change(int & x,int & y);
 int i=3,j=2;
 change(i,j);
 cout<<i<<endl;
 cout<<j<<endl;
 return 0;
}
void change(int & x,int & y){
  int z;
  z=x;
  x=y;
  y=z;
}



在函數(shù)change的形參中聲明了a,b是整形變量的引用。當main函數(shù)調(diào)用change函數(shù)時,把實參i的地址傳遞給形參x,把實參j的地址傳遞給形參y,從而使i和x共享同一個單元,使j和y共享同一個單元。也可以理解成,把i的變量名傳遞給了x,把j的變量名傳遞給了y。

引用作為形參與指針變量作為形參的區(qū)別

1使用引用類型,就不必在swap函數(shù)中聲明形參是指針變量。指針變量要另外開辟內(nèi)存單元,其內(nèi)容是地址。而引用不是一個獨立的變量,不單獨占內(nèi)存單元,引用的數(shù)據(jù)類型應該應該與實參相同。

2 在main函數(shù)中,實參不必用變量的地址,而是直接用變量名。系統(tǒng)向形參傳遞的是實參的地址而不是實參的值。

3 由于不能聲明指針的引用,那我們?nèi)绾蜗裰羔樐菢觽鬟f可以通過傳遞數(shù)組的首元素來實現(xiàn)傳遞整個數(shù)組的數(shù)據(jù)呢?

使用指針作為形參:

復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
void Print(int *p,int n);
    int a[5]={1,2,3,4,5};
    Print(a,5);
    return 0;
}
void Print(int *p,int n){
    int i;
    for(i=0;i<n;i++){
     cout<<p[i]<<endl;
    }
}


======================================================

使用引用作為形參

復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
void Print(int &p,int n);
    int a[5]={1,2,3,4,5};
    Print(a[0],5);
    return 0;
}
void Print(int &p,int n){
    int i;
    int *a=&p;
    for(i=0;i<n;i++){
       cout<<a[i]<<endl;
    }
}


因為引用就是給原來的變量起了別名,并且不能聲明指針的引用,所以我們就聲明指針指向的變量的引用,然后再對引用取地址,就達到了這個目的。

為了更清楚的說明,下面再舉一個例子:

復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
   int i=10;
   int *p;
   p=&i;//將i的地址賦給指針p
   int &y=*p;//將y作為指針p指向的變量的引用
   cout<<y<<endl;
   if(&y==p)cout<<"succeed"<<endl;//檢查y的地址和指針p的值是否相等
   return 0;
}


復制代碼 代碼如下:

#include<iostream>
using namespace std;
int main(){
   int a[5]={1,2,3,4,5};
   int &y=a[0];//聲明y作為數(shù)組的首元素的引用
   int *p=&y;//將y的地址賦給指針p
   int i=0;
   for(;i<5;i++){
      cout<<p[i]<<endl;
   }
   return 0;
}

相關(guān)文章

最新評論