C++ 語言左值引用 (lvalue reference)

Yongqiang Cheng 2021-08-16 01:22:59 阅读数:263

本文一共[544]字,预计阅读时长:1分钟~
c++ 引用 lvalue reference

C++ 語言左值引用 (lvalue reference)

C++11 中新增了右值引用 (rvalue reference)。當我們使用術語引用 (reference) 時,指的其實是左值引用 (lvalue reference)。

引用 (reference) 為對象起了另外一個名字,引用類型引用 (refers to) 另外一種類型。通過將聲明符寫成 &d 的形式來定義引用類型,其中 d 是聲明的變量名。

//============================================================================
// Name : Yongqiang Cheng
// Author : Yongqiang Cheng
// Version : Version 1.0.0
// Copyright : Copyright (c) 2020 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
int main()
{
int ival = 2048;
/* refval1 指向 ival,它是 ival 的另一個名字。 */
int &refval1 = ival;
/* 報錯:引用必須被初始化。 */
int &refval2;
return 0;
}
1>d:\visual_studio_workspace\...\yongqiang.cpp(20): error C2530: 'refval2': references must be initialized

一般在初始化變量時,初始值會被拷貝到新建的對象中。然而定義引用時,程序把引用和它的初始值綁定 (bind) 在一起,而不是將初始值拷貝給引用。一旦初始化完成,引用將和它的初始值對象一直綁定在一起。因為無法令引用重新綁定到另外一個對象,因此引用必須初始化。

1. 引用即別名

引用並非對象,它只是為一個已經存在的對象所起的另外一個名字。定義了一個引用之後,對其進行的所有操作都是在與之綁定的對象上進行的。

//============================================================================
// Name : Yongqiang Cheng
// Author : Yongqiang Cheng
// Version : Version 1.0.0
// Copyright : Copyright (c) 2020 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
int main()
{
int ival = 2048;
/* refval1 指向 ival,它是 ival 的另一個名字。 */
int &refval1 = ival;
/* 把 2 賦給了 refval1 指向的對象,即是賦給了 ival。 */
refval1 = 2;
/* 與 yq = ival 執行結果一樣。 */
int yq = refval1;
return 0;
}

在這裏插入圖片描述

為引用賦值,實際上是把值賦給了與引用綁定的對象。獲取引用的值,實際上是獲取了與引用綁定的對象的值。以引用作為初始值,實際上是以與引用綁定的對象作為初始值。

//============================================================================
// Name : Yongqiang Cheng
// Author : Yongqiang Cheng
// Version : Version 1.0.0
// Copyright : Copyright (c) 2020 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
int main()
{
int ival = 2048;
/* refval1 指向 ival,它是 ival 的另一個名字。 */
int &refval1 = ival;
/* 把 2 賦給了 refval1 指向的對象,即是賦給了 ival。 */
refval1 = 2;
/* 與 yq = ival 執行結果一樣,yq 被初始化為 ival 的值。 */
int yq = refval1;
/* refval2 綁定到了那個與 refval1 綁定的對象上,這裏就是綁定到 ival。 */
int &refval2 = refval1;
return 0;
}

在這裏插入圖片描述

因為引用本身不是一個對象,所以不能定義引用的引用。

2. 引用的定義

允許在一條語句中定義多個引用,其中每個引用標識符都必須以符號 & 開頭。

//============================================================================
// Name : Yongqiang Cheng
// Author : Yongqiang Cheng
// Version : Version 1.0.0
// Copyright : Copyright (c) 2020 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
int main()
{
/* i1 和 i2 都是 int。 */
int i1 = 1024, i2 = 2048;
/* ref1 是一個引用,與 i1 綁定,ref2 是 int。 */
int &ref1 = i1, ref2 = i2;
/* i3 是 int,ref3 是一個引用,與 i3 綁定。 */
int i3 = 4096, &ref3 = i3;
/* ref4 和 ref5 都是引用。 */
int &ref4 = i3, &ref5 = i2;
return 0;
}

在這裏插入圖片描述

引用只能綁定在對象上,而不能與字面值或某個錶達式的計算結果綁定在一起。

//============================================================================
// Name : Yongqiang Cheng
// Author : Yongqiang Cheng
// Version : Version 1.0.0
// Copyright : Copyright (c) 2020 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
int main()
{
/* 錯誤:引用類型的初始值必須是一個對象。 */
int &refval1 = 10;
double dval = 3.1415926;
/* 錯誤:此處引用類型的初始值必須是 int 對象。 */
int &refval2 = dval;
return 0;
}
1>d:\visual_studio_workspace\...\yongqiang.cpp(14): error C2440: 'initializing': cannot convert from 'int' to 'int &'
1>d:\visual_studio_workspace\...\yongqiang.cpp(19): error C2440: 'initializing': cannot convert from 'double' to 'int &'

References

(美) Stanley B. Lippman, (美) Josée Lajoie, (美) Barbara E. Moo 著, 王剛, 楊巨峰 譯. C++ Primer 中文版[M]. 第 5 版. 電子工業出版社, 2013.
https://www.informit.com/store/c-plus-plus-primer-9780321714114

版权声明:本文为[Yongqiang Cheng]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210816012233588k.html