程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 關於援用的幾點解釋引見

關於援用的幾點解釋引見

編輯:關於C++

關於"援用"的幾點解釋引見。本站提示廣大學習愛好者:(關於"援用"的幾點解釋引見)文章只能為提供參考,不一定能成為您想要的結果。以下是關於"援用"的幾點解釋引見正文


1、援用的根本常識

援用就是某一變量(目的)的一個體名,對援用的操作與對變量直接操作完整一樣。援用的聲明辦法:類型標識符 &援用名=目的變量名; 解釋:

(1)&在此不是求地址運算,而是起標識感化。

(2)類型標識符是指目的變量的類型。

(3)聲明援用時,必需同時對其停止初始化。

(4)援用聲明終了後,相當於目的變量名有兩個稱號,即該目的原稱號和援用名,且不克不及再把該援用名作為其他變量名的別號。

  int a,&ra=a;a為目的原稱號,ra為目的援用名。給ra賦值:ra=1; 等價於 a=1;

(5)聲明一個援用,不是新界說了一個變量,它只表現該援用名是目的變量名的一個體名,它自己不是一種數據類型,是以援用自己不占存儲單位,體系也不給援用分派存儲單位。故:對援用求地址,就是對目的變量求地址。&ra與a相等。

(6)不克不及樹立數組的援用。由於數組是一個由若干個元素所構成的聚集,所以沒法樹立一個數組的別號。

例如: Point pt1(10,10);

Point &pt2=pt1; 界說了pt2為pt1的援用。經由過程如許的界說,pt1和pt2表現統一對象。

須要特殊強調的是援用其實不發生對象的正本,僅僅是對象的同義詞。是以,當上面的語句履行後:

pt1.offset(12,12);

pt1和pt2都具有(12,12)的值。

援用必需在界說時立時被初始化,由於它必需是某個器械的同義詞。你不克不及先界說一個援用後才

初始化它。例以下面語句長短法的:
Point &pt3;
pt3=pt1;

那末既然援用只是某個器械的同義詞,它有甚麼用處呢?

上面評論辯論援用的兩個重要用處:作為函數參數和從函數中前往左值。

2、援用作為函數參數

1、傳遞可變參數

傳統的c中,函數在挪用時參數是經由過程值來傳遞的,這就是說函數的參數不具有前往值的才能。

所以在傳統的c中,假如須要函數的參數具有前往值的才能,常常是經由過程指針來完成的。好比,完成

兩整數變量值交流的c法式以下:

void swapint(int *a,int *b)

{

int temp;

temp=*a;

*a=*b;

*b=temp;

}

應用援用機制後,以上法式的c++版本為:

void swapint(int &a,int &b)

{

int temp;

temp=a;

a=b;

b=temp;

}

挪用該函數的c++辦法為:swapint(x,y); c++主動把x,y的地址作為參數傳遞給swapint函數。

2、給函數傳遞年夜型對象
當年夜型對象被傳遞給函數時,應用援用參數可以使參數傳遞效力獲得進步,由於援用其實不發生對象的

正本,也就是參數傳遞時,對象不必復制。上面的例子界說了一個無限整數聚集的類:

const maxCard=100;

Class Set

{

int elems[maxCard]; // 集和中的元素,maxCard 表現聚集中元素個數的最年夜值。

int card; // 聚集中元素的個數。

public:

Set () {card=0;} //結構函數

friend Set operator * (Set ,Set ) ; //重載運算符號*,用於盤算聚集的交集 用對象作為傳值參數

// friend Set operator * (Set & ,Set & ) 重載運算符號*,用於盤算聚集的交集用對象的援用作為傳值參數

...

}

先斟酌聚集交集的完成

Set operator *( Set Set1,Set Set2)

{

Set res;

for(int i=0;i<Set1.card;++i)

for(int j=0;j>Set2.card;++j)

if(Set1.elems==Set2.elems[j])

{

res.elems[res.card++]=Set1.elems;

break;

}

return res;

}

因為重載運算符不克不及對指針零丁操作,我們必需把運算數聲明為 Set 類型而不是 Set * 。

每次應用*做交集運算時,全部聚集都被復制,如許效力很低。我們可以用援用來防止這類情形。

Set operator *( Set &Set1,Set &Set2)

{

Set res;

for(int i=0;i<Set1.card;++i)

{

for(int j=0;j>Set2.card;++j)

if(Set1.elems==Set2.elems[j])

{

res.elems[res.card++]=Set1.elems;

break;

}

}

return res;

}

3、援用作為前往值
假如一個函數前往了援用,那末該函數的挪用也能夠被賦值。這裡有一函數,它具有兩個援用參數並前往一個雙精度數的援用:

double &max(double &d1,double &d2)

{

return d1>d2?d1:d2;

}

因為max()函數前往一個對雙精度數的援用,那末我們便可以用max() 來對個中較年夜的雙精度數加1:

max(x,y)+=1.0;

4、常援用
常援用聲明方法:const 類型標識符&援用名=目的變量名;

用這類方法聲明的援用,不克不及經由過程援用對目的變量的值停止修正,從而使援用的目的成為const,到達了援用的平安性。

【例】:

int a ;

const int &ra=a;

ra=1; //毛病

a=1; //准確

這不但是讓代碼更硬朗,也有些其它方面的須要。

【例】:假定有以下函數聲明:

string foo( );

void bar(string & s);

那末上面的表達式將長短法的:

bar(foo( ));

bar("hello world");

緣由在於foo( )和"hello world"串都邑發生一個暫時對象,而在C++中,這些暫時對象都是const類型的。是以下面的表達式就是試圖將一個const類型的對象轉換為非const類型,這長短法的。

援用型參數應當在能被界說為const的情形下,盡可能界說為const 。

5、援用和多態

援用是除指針外另外一個可以發生多態後果的手腕。這意味著,一個基類的援用可以指向它的派生類實例。

【例】:

class A;

class B:public A{……};

B b;

A &Ref = b; // 用派生類對象初始化基類對象的援用

Ref 只能用來拜訪派生類對象中從基類繼續上去的成員,是基類援用指向派生類。假如A類中界說有虛函數,而且在B類中重寫了這個虛函數,便可以經由過程Ref發生多態後果。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved