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

c++超細致講解引用

 更新時間:2022年05月09日 09:19:35   作者:panamera12  
引用(reference)就是C++對C語言的重要擴充。引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣

C和C++禁止在函數(shù)調用時直接傳遞數(shù)組的內容,而是強制傳遞數(shù)組指針,而對于結構體和對象沒有這種限制,調用函數(shù)時既可以傳遞指針,也可以直接傳遞內容;為了提高效率,我曾建議傳遞指針,這樣做在大部分情況下并沒有什么不妥。

但是在 C++ 中,我們有了一種比指針更加便捷的傳遞聚合類型數(shù)據(jù)的方式,那就是引用

在 C/C++ 中,我們將 char、int、float 等由語言本身支持的類型稱為基本類型,將數(shù)組、結構體、類(對象)等由基本類型組合而成的類型稱為聚合類型(在講解結構體時也曾使用復雜類型、構造類型這兩種說法)。

引用(Reference)是 C++ 相對于C語言的又一個擴充。引用可以看做是數(shù)據(jù)的一個別名,通過這個別名和原來的名字都能夠找到這份數(shù)據(jù)。引用類似于 Windows 中的快捷方式,一個可執(zhí)行程序可以有多個快捷方式,通過這些快捷方式和可執(zhí)行程序本身都能夠運行程序;引用還類似于人的綽號(筆名),使用綽號(筆名)和本名都能表示一個人。

引用的定義方式類似于指針,只是用&取代了*,語法格式為:type &name = data;

type 是被引用的數(shù)據(jù)的類型,name 是引用的名稱,data 是被引用的數(shù)據(jù)。引用必須在定義的同時初始化,并且以后也要從一而終,不能再引用其它數(shù)據(jù),這有點類似于常量(const 變量)。

#include <iostream>
using namespace std;
int main() {
    int a = 99;
    int &r = a;
    cout << a << ", " << r << endl;
    cout << &a << ", " << &r << endl;
    return 0;
}

運行結果:

99, 99

0x28ff44, 0x28ff44

本例中,變量 r 就是變量 a 的引用,它們用來指代同一份數(shù)據(jù);也可以說變量 r 是變量 a 的另一個名字。從輸出結果可以看出,a 和 r 的地址一樣,都是0x28ff44;或者說地址為0x28ff44的內存有兩個名字,a 和 r,想要訪問該內存上的數(shù)據(jù)時,使用哪個名字都行。

注意,引用在定義時需要添加&,在使用時不能添加&,使用時添加&表示取地址。如上面代碼所示,第 6 行中的&表示引用,第 8 行中的&表示取地址。除了這兩種用法,&還可以表示位運算中的與運算。

由于引用 r 和原始變量 a 都是指向同一地址,所以通過引用也可以修改原始變量中所存儲的數(shù)據(jù),請看下面的例子:

#include <iostream>
using namespace std;
int main() {
    int a = 99;
    int &r = a;
    cout << a << ", " << r << endl;
    cout << &a << ", " << &r << endl;
    return 0;
}

運行結果:

47, 47

最終程序輸出兩個 47,可見原始變量 a 的值已經被引用變量 r 所修改。

如果讀者不希望通過引用來修改原始的數(shù)據(jù),那么可以在定義時添加 const 限制,形式為:

const type &name = value;

也可以是:

type const &name = value;

這種引用方式為常引用

  • C++引用作為函數(shù)參數(shù)

在定義或聲明函數(shù)時,我們可以將函數(shù)的形參指定為引用的形式,這樣在調用函數(shù)時就會將實參和形參綁定在一起,讓它們都指代同一份數(shù)據(jù)。如此一來,如果在函數(shù)體中修改了形參的數(shù)據(jù),那么實參的數(shù)據(jù)也會被修改,從而擁有“在函數(shù)內部影響函數(shù)外部數(shù)據(jù)”的效果。

一個能夠展現(xiàn)按引用傳參的優(yōu)勢的例子就是交換兩個數(shù)的值,請看下面的代碼:

#include <iostream>
using namespace std;
void swap1(int a, int b);
void swap2(int *p1, int *p2);
void swap3(int &r1, int &r2);
int main() {
    int num1, num2;
    cout << "Input two integers: ";
    cin >> num1 >> num2;
    swap1(num1, num2);
    cout << num1 << " " << num2 << endl;
    cout << "Input two integers: ";
    cin >> num1 >> num2;
    swap2(&num1, &num2);
    cout << num1 << " " << num2 << endl;
    cout << "Input two integers: ";
    cin >> num1 >> num2;
    swap3(num1, num2);
    cout << num1 << " " << num2 << endl;
    return 0;
}
//直接傳遞參數(shù)內容
void swap1(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}
//傳遞指針
void swap2(int *p1, int *p2) {
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}
//按引用傳參
void swap3(int &r1, int &r2) {
    int temp = r1;
    r1 = r2;
    r2 = temp;
}

運行結果:

Input two integers: 12 34↙

12 34

Input two integers: 88 99↙

99 88

Input two integers: 100 200↙

200 100

本例演示了三種交換變量的值的方法:

1) swap1() 直接傳遞參數(shù)的內容,不能達到交換兩個數(shù)的值的目的。對于 swap1() 來說,a、b 是形參,是作用范圍僅限于函數(shù)內部的局部變量,它們有自己獨立的內存,和 num1、num2 指代的數(shù)據(jù)不一樣。調用函數(shù)時分別將 num1、num2 的值傳遞給 a、b,此后 num1、num2 和 a、b 再無任何關系,在 swap1() 內部修改 a、b 的值不會影響函數(shù)外部的 num1、num2,更不會改變 num1、num2 的值。

2) swap2() 傳遞的是指針,能夠達到交換兩個數(shù)的值的目的。調用函數(shù)時,分別將 num1、num2 的指針傳遞給 p1、p2,此后 p1、p2 指向 a、b 所代表的數(shù)據(jù),在函數(shù)內部可以通過指針間接地修改 a、b 的值。

3) swap3() 是按引用傳遞,能夠達到交換兩個數(shù)的值的目的。調用函數(shù)時,分別將 r1、r2 綁定到 num1、num2 所指代的數(shù)據(jù),此后 r1 和 num1、r2 和 num2 就都代表同一份數(shù)據(jù)了,通過 r1 修改數(shù)據(jù)后會影響 num1,通過 r2 修改數(shù)據(jù)后也會影響 num2。

從以上代碼的編寫中可以發(fā)現(xiàn),按引用傳參在使用形式上比指針更加直觀。引用一般可以代替指針

  • C++引用作為函數(shù)返回值

引用除了可以作為函數(shù)形參,還可以作為函數(shù)返回值,請看下面的例子:

#include <iostream>
using namespace std;
int &plus10(int &r) {
    r += 10;
    return r;
}
int main() {
    int num1 = 10;
    int num2 = plus10(num1);
    cout << num1 << " " << num2 << endl;
    return 0;
}

運行結果:

20 20

在將引用作為函數(shù)返回值時應該注意一個小問題,就是不能返回局部數(shù)據(jù)(例如局部變量、局部對象、局部數(shù)組等)的引用,因為當函數(shù)調用完成后局部數(shù)據(jù)就會被銷毀,有可能在下次使用時數(shù)據(jù)就不存在了,C++ 編譯器檢測到該行為時也會給出警告。

到此這篇關于c++超細致講解引用的文章就介紹到這了,更多相關c++引用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++獲取字符串長度的幾個函數(shù)方式

    C++獲取字符串長度的幾個函數(shù)方式

    這篇文章主要介紹了C++獲取字符串長度的幾個函數(shù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++中二叉堆排序詳解

    C++中二叉堆排序詳解

    這篇文章主要介紹了C++中二叉堆排序詳解,主要介紹了二叉堆排序(遞歸和非遞歸實現(xiàn)上沉、下沉算法),需要的朋友可以參考下
    2023-01-01
  • C語言使用四種方法初始化結構體

    C語言使用四種方法初始化結構體

    這篇文章說明了什么是結構體,介紹了結構體的概念和使用優(yōu)點,在C語言中如何使用和初始化結構體方法,通過詳細的代碼展開進行說明,希望該篇文章對你有所幫助
    2021-06-06
  • c++ STL庫容器之集合set代碼實例

    c++ STL庫容器之集合set代碼實例

    在本篇文章里小編給大家整理的是關于c++STL庫容器之集合set代碼實例,需要的朋友們可以參考下。
    2020-03-03
  • C++實現(xiàn)添加桌面右鍵新建菜單

    C++實現(xiàn)添加桌面右鍵新建菜單

    本文給大家匯總了3個版本的C++實現(xiàn)添加桌面右鍵新建菜單的代碼,陸陸續(xù)續(xù)寫的,有需要的小伙伴可以根據(jù)自己的需求來選擇
    2016-01-01
  • C語言中的指針新手初階指南

    C語言中的指針新手初階指南

    指針是C語言的靈魂,精華之所在,指針強大而危險,用得好是一大利器,用得不好是一大潛在危害,下面這篇文章主要給大家介紹了C語言中指針的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • C語言中操作sqlserver數(shù)據(jù)庫案例教程

    C語言中操作sqlserver數(shù)據(jù)庫案例教程

    這篇文章主要介紹了C語言中操作sqlserver數(shù)據(jù)庫案例教程,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • CMake編譯中的庫文件和頭文件鏈接你了解嗎

    CMake編譯中的庫文件和頭文件鏈接你了解嗎

    這篇文章主要為大家詳細介紹了CMake編譯中的庫文件和頭文件鏈接,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言入門之基礎知識詳解

    C語言入門之基礎知識詳解

    這篇文章主要介紹了C語言入門之基礎知識詳解,文中有非常詳細的C語言使用教程及相關基礎知識,對正在學習c語言的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • C語言實現(xiàn)memcpy函數(shù)的使用示例

    C語言實現(xiàn)memcpy函數(shù)的使用示例

    在C語言中,我們可以自己實現(xiàn) memcpy 函數(shù)來實現(xiàn)內存數(shù)據(jù)的拷貝操作,本文就來介紹一下C語言實現(xiàn)memcpy函數(shù)的使用示例,感興趣的可以了解一下
    2023-09-09

最新評論