C++ 引用 (Reference)
C++ Reference
引用實際上是指針的一個擴展,但是又不同于指針。
首先,引用必須引用一個已經存在的變量。不像指針,指針可以被聲明為空指針,但引用不可以。引用本身并不是一個新的變量,它并不實際占用內存空間,也并不實際儲存數據,它僅僅是一個變量的引用。
舉例說明:
#include <iostream>#define LOG(x) std::cout << x << std::endl;int main() {int a = 5;int& ref = a;std::cin.get(); }在上述代碼中,ref 是變量 a 的引用。實際上,ref 相當于變量 a 的別名。 如果將上述代碼編譯,實際上只會在內存空間中創建一個變量 a。
如果改變 ref 的值,打印 a:
#include <iostream>#define LOG(x) std::cout << x << std::endl;int main() {int a = 5;int& ref = a;ref = 2;LOG(a);std::cin.get(); }則 a 的值也為 2.
即變量的引用僅僅相當于該變量的別名,并不會重新生成一個變量。
那么既然僅僅只是給變量起一個別名,什么情況下我們需要用到引用呢?就上述情況而言,我們直接調用變量 a 就可以了,為啥要多寫幾行代碼來創建一個引用呢?
看下面的例子:
#include <iostream>#define LOG(x) std::cout << x << std::endl;void Increment(int value) {value++; }int main() {int a = 5;Increment(a);LOG(a);std::cin.get(); }如果我們想要變量 a 調用 Increment,然后自加 1. 上述代碼是無法實現這個結果的 ,實際輸出 a 的值仍然為 5。這是因為 將變量 a 傳給方法 Increment, 相當于復制該變量到方法里。
等同于如下效果:
void Increment(int value) {int a = 5;value++; }所以并不會改變變量 a 的值。
那想要達到我們想要的結果,如何做呢?
首先,當然,指針是可以做到的。指針指向的是變量的內存空間中的地址,即變量實際存在的地方。如果我們直接把變量的地址傳給 Increment 函數,那肯定是可以改變該變量的值的,如下所示:
#include <iostream>#define LOG(x) std::cout << x << std::endl;void Increment(int* value) {(*value)++; }int main() {int a = 5;Increment(&a);LOG(a);std::cin.get(); }輸出結果為 6.
可以看到,指針確實能得到我們想要的結果。但有沒有更簡單清晰一點的方法呢?
#include <iostream>#define LOG(x) std::cout << x << std::endl;void Increment(int& value) {value++; }int main() {int a = 5;Increment(a);LOG(a);std::cin.get(); }運行結果為 6. 可見引用也可以實現我們的目的,并且讓代碼看起來更加簡潔。
再看一個例子:
#include <iostream>#define LOG(x) std::cout << x << std::endl;int main() {int a = 5;int b = 8; int& ref = a;ref = b;LOG(a);LOG(b);std::cin.get(); }輸出結果為 8, 8。 即變量 a 等于 b = 8。 為什么會這樣? 因為引用只能被初始化一次,指向一個變量,并且不能夠改變。同時,引用在被聲明的同時一定要被初始化。當然,指針是可以先指向一個變量,然后指向另一個變量的。
總結
以上是生活随笔為你收集整理的C++ 引用 (Reference)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 史上最全的CTF保姆教程 从入门到入狱【
- 下一篇: mysql 安装插件 validate_