C 拾遺 引用 左值引用 右值引用

2021-07-15 05:29:46 字數 2752 閱讀 9171

引用就是別名(alias)。所謂別名,就是對已存在的物件另起乙個名字。本身含義並不難理解,但與其它概念一組合,就成了使用難點。再加上新標準提出了新的一種引用-右值引用,引用這一概念就變得更加難以理解和使用。

隨著新標準(新標準往往就是新的技術)的提出,引用這一概念分成兩類:左值引用、右值引用。其中左值引用是最常用的一種,而右值引用則是語言使用上的一種革新。

1.左值引用

左值引用的基本語法

type &引用名 = 左值表示式;

#include 

using

namespace

std;

int main()

執行

引用的基本規則

宣告引用的時候必須初始化,且一旦繫結,不可把引用繫結到其他物件。

對引用的一切操作,就相當於對原物件的操作。

2.右值引用

以上是最常見的引用方式,我們稱之為左值引用。為了順利區分左右值引用的概念,我們先來看下左右值的概念。

首先,左右值是表示式的屬性。何為表示式?表示式由乙個或多個運算物件組成。字面值和變數是最簡單的表示式。

乙個物件被用作右值時,使用的是它的內容(值),被當作左值時,使用的是它的位址。

int a = 1;

a + 1; //a + 1 是表示式

在c++舊標準中,我們可以引用a,但卻無法引用a+1,這是為什麼呢?

這是因為,變數a被建立後,在它的作用域內是一直存在的。如此一來,它的引用是有存在意義的。而a+1不是乙個物件,在運算中臨時存在於暫存器中,而暫存器中的值是時刻被重新整理的,建立a+1的引用顯得沒有任何意義。為了成功的使用類似於a+1這種右值的引用。c++新標準提出了區別於以往的引用-右值引用。

右值引用的基本語法

type &&引用名 = 右值表示式;

#include 

using

namespace

std;

int main()

執行

對右值引用的一種可能的內部實現解釋

int a = 1;

int *p = new

int(a + 1);

int &ra = *p;

delete p; //不再使用引用了,動態記憶體的釋放由c++自動管理

其中第

二、三兩句就對應右值引用:int &&ra(a+1);

3.引用作為函式引數

引用作為函式引數時,有著指標一樣的功能。

#include 

using

namespace

std;

void fun(int &ra)

int main()

執行

在函式fun內,對形參ra的值,做出了更改,這一操作影響了實參a。顯然引用的使用比指標簡單。

4.引用與陣列

int a;

int (&ra)[5] = a; //對陣列進行引用

5.引用與指標引用一級指標

int a(0), *p = &a;

int*&rp = p;

引用二級指標

int a(0), *p = &a;

int**pp = &p;

int**&rp = pp; //引用二級指標,若編譯不通過,使用 int (**(&rp)) = pp;

6.引用與函式指標

#include 

using namespace std;

int add(int a, int b)

intsub(int a, int b)

int mul(int a, int b)

int divi(int a, int b)

int main()

; cout << "使用函式指標陣列"

<< endl;

cout << pfuns[0](a, b) << ends << pfuns[1](a, b) << ends << pfuns[2](a, b) << ends << pfuns[3](a, b) << endl;

cout << "函式指標的引用"

<< endl;

int(*(&rfun0))(int, int)(pfuns[0]);

int(*(&rfun1))(int, int)(pfuns[1]);

int(*(&rfun2))(int, int)(pfuns[2]);

int(*(&rfun3))(int, int)(pfuns[3]);

cout << rfun0(a, b) << ends << rfun1(a, b) << ends << rfun2(a, b) << ends << rfun3(a, b) << endl;

cin.get();

return

0;}

執行

C 引用(左值引用,右值引用)

特點 引用 引用本質指標實現。引用一旦初始化,不會引用其他變數。右值引用目的 快速建立暫存器資料的引用,就是還沒有記憶體實體的資料可以立即建立乙個引用。一般寫模板函式有乙個左值引用的模板函式,都會對應乙個右值引用的模板函式,即使實現 是相同的。左值 有記憶體實體 右值 暫存器的值 move 把左值當...

c 左值 右值 右值引用 左值引用

c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...

c 左值 右值 左值引用 右值引用

在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...