国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C++初級(jí)主題--(4)引用

2019-11-14 10:45:16
字體:
供稿:網(wǎng)友

一.引用的概念

C++函數(shù)中參數(shù)的傳遞方式是傳值。在函數(shù)域中為參數(shù)重新分配內(nèi)存,而把實(shí)參的數(shù)值傳遞到新分配的內(nèi)存中。它的優(yōu)點(diǎn)是有效避免函數(shù)的副作用(即改變實(shí)參的值)。 如果要求改變實(shí)參的值,怎么辦呢?如果實(shí)參是一個(gè)復(fù)雜的對(duì)象,重新分配內(nèi)存會(huì)引起程序執(zhí)行效率大大下降,怎么辦呢?在C++中有一種新的導(dǎo)出型數(shù)據(jù)類型—引用(reference)可以解決上面的難題。引用又稱別名(alias)。

二.傳值和傳引用的區(qū)別

1.用交換程序舉例說明 (1)直接通過傳值的方式無法更改實(shí)參的值

#include<iostream>using namespace std;void swap1(int x, int y){ int tmp = y; y = x; x = tmp;}void main(){ int a = 10; int b = 20; swap1(a,b);}

a,b的值仍未交換,只交換了x,y的值。 這里寫圖片描述 (2)C語言中通過指針的方式可以交換

#include<iostream>using namespace std;void swap1(int *x, int *y){ int tmp = *y; *y = *x; *x = tmp;}void main(){ int a = 10; int b = 20; swap1(&a,&b);}

可以看到x,y與a,b的地址不同,額外為形參開辟了空間 這里寫圖片描述 (3)C++中提供引用的方式

#include<iostream>using namespace std;void swap1(int &x, int &y){ int tmp = y; y = x; x = tmp;}void main(){ int a = 10; int b = 20; swap1(a,b);}

可以看到x,y的地址與a,b相同,是a,b的別名,沒有重新分配空間。 這里寫圖片描述

2.總結(jié) (1)傳引用可以直接更改實(shí)參的值 (2)傳引用不用額外分配空間保存實(shí)參的數(shù)值。 (3)不能定義空引用,即引用的對(duì)象必須存在。 3.引用的本質(zhì)仍是指針 關(guān)于這一點(diǎn),請(qǐng)參考博文 c++ 引用 底層實(shí)現(xiàn)機(jī)制

引用是在編譯的過程中被處理的,實(shí)際上就是在編譯層面對(duì)程序員進(jìn)行的一個(gè)比較友好的語法,而在實(shí)現(xiàn)上是由編譯器完成了地址的傳遞,實(shí)質(zhì)上還是指針。 不能簡單的理解為一個(gè)別名,我們可以這樣用,但是要知道底層就是一個(gè)指針變量,是要占用內(nèi)存空間的,和define是不一樣的。

三.引用的分類

1.變量的引用

int a = 10;int b = &a;

b是a的引用

2.指針的引用

int a = 10;int *p = &a;int *&q = p;

q是p的引用

3.數(shù)組的引用

int ar[10] = {0};int (&br)[10] = ar;

br是ar的引用

4.常量的引用 (1)常量必須用常量引用

const int x = 100;const int &y = x;

(2)變量可以用常量引用

int x = 100;const int &y = x;

(3)不同類型間進(jìn)行常引用

double x = 13.14;const int &y = x;

這里寫圖片描述可以看到y(tǒng)與x的地址不同,此時(shí),不同類型之間進(jìn)行賦值運(yùn)算,一定會(huì)產(chǎn)生臨時(shí)對(duì)象(假設(shè)為tmp),最終y是tmp的引用。同時(shí),應(yīng)注意:對(duì)于所有的臨時(shí)對(duì)象,必須同樣假設(shè)它們是不可存取的,即具有常量的性質(zhì)。當(dāng)改變這種數(shù)據(jù)時(shí),編譯器會(huì)指出錯(cuò)誤,這是非常有用的提示,因?yàn)檫@個(gè)改變會(huì)導(dǎo)致信息丟失。

5.函數(shù)中的引用,即函數(shù)返回引用或函數(shù)參數(shù)中包含引用

(1)最經(jīng)常看見引用的地方是在函數(shù)參數(shù)和返回值中。當(dāng)引用被用作函數(shù)參數(shù)時(shí),在函數(shù)內(nèi)任何對(duì)引用的更改將對(duì)函數(shù)外的參數(shù)產(chǎn)生改變。 (2)當(dāng)然可以傳遞一個(gè)指針來做相同的事情,但引用具有更清晰的語法。(可以把引用看作一個(gè)使語法更加便利的工具。) (3)如果函數(shù)返回一個(gè)引用,必須像從函數(shù)返回一個(gè)指針一樣對(duì)待。當(dāng)函數(shù)返回時(shí),無論引用關(guān)聯(lián)的是什么都應(yīng)該存在,否則,將不知道指向哪一個(gè)內(nèi)存

int* fun1(int *x) //(2){ (*x)++; return x; //正確,x指向確定的內(nèi)存} int& fun2(int &x) //(1){ x++; return x; //正確,x指向確定的內(nèi)存}int& fun3(){ int q; //return q; //錯(cuò)誤,局部變量,最終指向不明確的內(nèi)存 static int p; return p; //正確,盡管fun3運(yùn)行結(jié)束,但是p被static修飾,為全局變量,生存作用域仍存在,指向明確的內(nèi)存}int main(){ int a = 10; fun1(&a); //ugly(but explicit) fun2(a); //clean(but hidden) }

四.參數(shù)傳遞準(zhǔn)則

當(dāng)給函數(shù)傳遞參數(shù)時(shí),人們習(xí)慣上通過常量引用來傳遞。雖然看起來似乎僅是出于效率考慮(通常在設(shè)計(jì)與裝配程序時(shí)并不考慮效率),但是這樣會(huì)帶來很多危險(xiǎn)。拷貝構(gòu)造函數(shù)需要通過傳值方式傳遞對(duì)象,但并不總是可行的 這種簡單習(xí)慣可以大大提高效率:傳值方式會(huì)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),但是如果不想改變參數(shù),則可以通過常量引用傳遞,它僅需要將地址壓棧。

事實(shí)上,只有一種情況不適合用傳地址方式。就是當(dāng)傳值是唯一安全的途徑,否則將會(huì)破壞對(duì)象時(shí)。所以需要依據(jù)上下文


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 嘉义县| 岫岩| 潞城市| 甘泉县| 河津市| 新源县| 尉氏县| 沙雅县| 镇坪县| 南川市| 神池县| 古交市| 武隆县| 沛县| 镇赉县| 武乡县| 庐江县| 乐山市| 奉贤区| 新干县| 张掖市| 绵阳市| 马尔康县| 瑞丽市| 高州市| 塔城市| 灵宝市| 卫辉市| 建德市| 诸暨市| 于都县| 长垣县| 论坛| 吉木乃县| 托克逊县| 古蔺县| 株洲市| 油尖旺区| 五指山市| 隆安县| 芦山县|