您好,登錄后才能下訂單哦!
C++引入了引用這個(gè)類型,引用實(shí)際是給變量起了一個(gè)別名,實(shí)際上,引用只是別名沒(méi)有獨(dú)立的內(nèi)存空間,和它所引用的變量共享內(nèi)存空間。
變量的屬性有兩種:名稱和空間。
而引用只有名稱沒(méi)有獨(dú)立的空間。
對(duì)引用的改變就是對(duì)它所引用的變量的改變。
格式:int a = 1; int& b = a;
Δ定義引用時(shí)一定要初始化,指明該引用變量是誰(shuí)的別名。
Δ引用一經(jīng)初始化不能重新指向其他變量。
實(shí)際引用中,引用一般用作參數(shù)傳遞與返回值。
- # include <iostream>
- using namespace std;
- int main(void)
- {
- int val = 100;
- //定義引用
- int& refval = val; //引用必須初始化
- //int& refval; error 引用必須初始化
- cout<< "val = " << val << endl;
- refval = 200; //實(shí)際上改變的是val變量
- cout << "refval = " << refval << endl; //結(jié)果是200
- int val2 = 500;
- refval = val2 ; //這只是簡(jiǎn)單的賦值,不代表refval引用至val2這個(gè)變量
- cout << "val2 = " << val2 << endl; //500
- return 0;
- }
運(yùn)行結(jié)果:
const引用,指向const對(duì)象的引用
const int ival = 1024; const int& refval = ival;
Δ普通變量引用const變量是非法的
const int ival = 1024; int& refval = ival ; //error
Δconst變量引用普通變量是合法的。
- # include<iostream>
- using namespace std;
- int main(void)
- {
- const int val = 1024;
- const int& refval = val;
- // int& ref2 = val; error,nonconst reference to a const object
- cout<<"refval = " << val << endl;
- int val2 = 1024;
- const int& ref3 = val2; //允許的
- //ref3 = 200; 錯(cuò)誤的,不能更改const常量
- cout << "ref3 = " << ref3 << endl;
- double val3 = 3.4;
- //warning C4244: “初始化”: 從“double”轉(zhuǎn)換到“const int”,可能丟失數(shù)據(jù)
- const int& ref4 = val3; //等價(jià)于產(chǎn)生了一個(gè)臨時(shí)變量,int temp = val3; const int& ref4 = temp
- cout << "val3 = " << val3 << endl;
- cout << "ref4 = " << ref4 << endl;
- // int& ref5 = val3; 非const不能引用double類型的變量
- return 0;
- }
運(yùn)行結(jié)果:
引用做函數(shù)參數(shù)傳遞:
- //按引用傳遞
- //swap(int &a, int &b);
- //C語(yǔ)言里面:
- // 值傳遞 形參不能更改實(shí)參
- // 指針傳遞
- //地址傳遞方式通過(guò)形參的改變使相應(yīng)的實(shí)參改變
- //引用傳遞也是可以的
- //引用作為參數(shù)傳遞
- # include <iostream>
- using namespace std;
- void swap(int &x, int &y);
- int main(void)
- {
- int a = 5;
- int b = 6;
- cout<<"交換前" << "a = " << a <<" b = " << b << endl;
- swap(a,b);//在函數(shù)調(diào)用的時(shí)候,引用被初始化 , x = a ,y = b
- cout<<"交換后" << "a = " << a <<" b = " << b << endl;
- return 0;
- }
- void swap(int &x, int &y) //形參是引用,調(diào)用的時(shí)候被初始化
- {
- int temp = x;
- x = y;
- y = temp;
- }
運(yùn)行結(jié)果:
下面總結(jié)下引用于指針的區(qū)別:
引用訪問(wèn)一個(gè)變量是直接訪問(wèn),
指針是間接訪問(wèn)
引用只是別名,本身不分配內(nèi)存空間
指針本身就是一個(gè)變量,有自己的內(nèi)存空間
引用一經(jīng)初始化就不能再引用其他變量,
指針初始化后引用其他變量,除非const
值傳遞的時(shí)候,實(shí)參要初始化形參,就好分配一個(gè)形參變量,將實(shí)參內(nèi)容拷貝到形參
如果是類傳遞的話,還要調(diào)用拷貝函數(shù)
指針傳遞 實(shí)參初始化形參的時(shí)候也是要分配空間的,
引用傳遞 實(shí)參初始化形參時(shí)不分配空間,效率會(huì)高點(diǎn)
指針傳遞 本質(zhì)還是值傳遞,如果要修改指針的地址,單純用指針傳遞也不能的
僅僅修改指針指向的內(nèi)容,**,指針引用*&
引用作為函數(shù)返回值:
- //引用作為返回值,將函數(shù)放在賦值運(yùn)算符的左邊
- # include <iostream>
- using namespace std;
- int a[] = {0,1,2,3,4};
- int& index(int i)
- {
- return a[i];
- //函數(shù)返回引用,引用在函數(shù)返回的時(shí)候初始化
- //index(3) 在函數(shù)返回的時(shí)候被初始化為a[3]
- }
- int main(void)
- {//引用作為函數(shù)返回值,使得函數(shù)可以放在運(yùn)算符的左邊
- index(3) = 100;
- cout << "a[3] = " << a[3] << endl; //100
- return 0;
- }
運(yùn)行結(jié)果:
不能返回對(duì)局部變量的引用,或自動(dòng)化變量的引用:
運(yùn)行結(jié)果:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。