顯示廣告
隱藏 ✕
看板 uefacool
作者 uefangsmith(雲飛)
標題 [轉錄][轉錄][C++] Call by Reference
時間 2010年03月26日 Fri. AM 12:45:14


※ 本文轉錄自 Programming 看板

看板 Programming
作者 Knuckles(阿德)
標題 [轉錄][C++] Call by Reference
時間 2010年03月08日 Mon. AM 12:57:00


※ 本文轉錄自 Knuckles_note 看板

看板 Knuckles_note
作者 Knuckles(阿德)
標題 [C++] Call by Reference
時間 2010年03月07日 Sun. PM 04:45:19


看完上兩篇之後,我們想知道有沒有什麼
可以在副程式中改變主程式的變數,然後又比用指標簡單的方法
也就是這篇要講的 Call by Reference

其實在 C語言 就只能用指標了
是到了 C++ 才多了個 參考(Reference) 這種東西讓我們用

但也不是說有 Reference,指標就沒用了
指標還可以用在很多地方,像是存取陣列、字串之類的
Reference,大概就只能用在呼叫副程式上了

先簡介一下 Reference 的用法

^LReference簡介

Reference 其實就是一個變數的別名而已

^LReference簡介

Reference 其實就是一個變數的別名而已

當我們宣告一個普通的整數變數時
	
	
	
在記憶體中長這樣:
	
	
	
	
	
	
Address
	
    Name  Value
	
int a = 5;
	
	
	
	
0x100       a       5

^LReference簡介

Reference 其實就是一個變數的別名而已

當我們宣告一個普通的整數變數時
	
	
	
在記憶體中長這樣:
	
	
	
	
	
	
Address
	
    Name  Value
	
int a = 5;
	
	
	
	
0x100       a       5

要宣告一個參考 a 的 reference 就這樣:

	
int& r_a = a;
	
	
	
	
0x100       r_a     5
	
  ↑
	
就跟要被參考的變數一樣的型態 再加上個 &

^LReference簡介

Reference 其實就是一個變數的別名而已

當我們宣告一個普通的整數變數時
	
	
	
在記憶體中長這樣:
	
	
	
	
	
	
Address
	
    Name  Value
	
int a = 5;
	
	
	
	
0x100       a       5

要宣告一個參考 a 的 reference 就這樣:

	
int& r_a = a;
	
	
	
	
0x100       r_a     5
                 ↗
	
	
直接把要被參考的變數名稱丟給剛宣告的reference就好了
	
	
要注意的是宣告reference時就要給定要被參考的對象,然後就不能改了

^LReference簡介

Reference 其實就是一個變數的別名而已

當我們宣告一個普通的整數變數時
	
	
	
在記憶體中長這樣:
	
	
	
	
	
	
Address
	
    Name  Value
	
int a = 5;
	
	
	
	
0x100       a       5

要宣告一個參考 a 的 reference 就這樣:

	
int& r_a = a;
	
	
	
	
0x100       r_a     5
                                                  ↑
                                                可以發現 r_a 跟 a 共用同一塊記憶體
	
	
	
	
	
	
只是名字不一樣,就只是個別名而已

^LReference簡介

Reference 其實就是一個變數的別名而已

當我們宣告一個普通的整數變數時
	
	
	
在記憶體中長這樣:
	
	
	
	
	
	
Address
	
    Name  Value
	
int a = 5;
	
	
	
	
0x100       a       5

要宣告一個參考 a 的 reference 就這樣:

	
int& r_a = a;
	
	
	
	
0x100       r_a     5

用法很簡單,就跟一般變數沒兩樣
只要改reference的值,被參考變數的值也會跟著變,因為是共用同一塊記憶體

直接來看用在 swap() 的例子:

^LCall by Reference

#include <iostream>
	
	
	
這是 Call by Value 的寫法
using namespace std;

void swap(int,int);
	
	
	


int main()
	
	
	
	

{
	
int a=3,b=4;
	
	
	

	
swap(a,b);
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int a, int b)
{
	
int c = a;
	
a = b;
	
b = c;
}

^LCall by Reference

#include <iostream>
	
	
	

using namespace std;

void swap(int&,int&);
	
	
	
← 輸入變數的型態改為 reference

int main()
	
	
	
	

{
	
int a=3,b=4;
	
	
	

	
swap(a,b);
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int& a, int& b)
	
	
← 輸入變數的型態改為 reference
{
	
int c = a;
	
a = b;
	
b = c;
}

^LCall by Reference

#include <iostream>
	
	
	
這樣就好了,簡單吧
using namespace std;

void swap(int&,int&);
	
	
	


int main()
	
	
	
	

{
	
int a=3,b=4;
	
	
	

	
swap(a,b);
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int& a, int& b)
{
	
int c = a;
	
a = b;
	
b = c;
}

^LCall by Reference

#include <iostream>
	
	
	
在程式還沒有執行時
using namespace std;
	
	
	
	
	
在記憶體中長這樣:
void swap(int&,int&);
	
	
	


int main()
	
	
	
	
main() 的變數:
{
	
	
	
	
	
Address  Name  Value
	
int a=3,b=4;
	
	
	
0x100    a     3
	
swap(a,b);
	
	
	
0x104    b     4
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int& a, int& b)
	
	
swap() 的變數:
{
	
	
	
	
	
Address  Name  Value
	
int c = a;
	
	
	

	
a = b;
	
	
	
	

	
b = c;
	
	
	
	

}

^LCall by Reference

#include <iostream>
	
	
	
執行到 swap(a,b); 時
using namespace std;
	
	
	
	
	
在記憶體中長這樣:
void swap(int&,int&);
	
	
	


int main()
	
	
	
	
main() 的變數:
{
	
	
	
	
	
Address  Name  Value
	
int a=3,b=4;
	
	
	
0x100    a     3
	
swap(a,b); 
	
	
	
0x104    b     4
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int& a, int& b)
	
	
swap() 的變數:
	
	
  注意在 swap() 中的 a,b
{
	
	
	
	
	
Address  Name  Value
	
  與 main() 中的 a,b 共用相同的位址
	
int c = a;
	
	
	
0x100    a     3  
	
a = b;
	
	
	
	
0x104    b     4
	
b = c;
	
	
	
	
0x200    c
}

^LCall by Reference

#include <iostream>
	
	
	
執行完 swap() 後
using namespace std;
	
	
	
	
	
在記憶體中長這樣:
void swap(int&,int&);
	
	
	


int main()
	
	
	
	
main() 的變數:
{
	
	
	
	
	
Address  Name  Value
	
int a=3,b=4;
	
	
	
0x100    a     4
	
swap(a,b); 
	
	
	
0x104    b     3
	
cout << "a=" << a
	
     << ",b=" << b << endl;
	


	
return 0;
	
	
	

}

void swap(int& a, int& b)
	
	
swap() 的變數:
	
	
  swap() 只要改了他可存取的 a,b 值
{
	
	
	
	
	
Address  Name  Value
	
  main() 中 a,b 的值也被改了
	
int c = a;
	
	
	
0x100    a     4   
	
  因為是共用同一塊記憶體啊
	
a = b;
	
	
	
	
0x104    b     3
	
b = c;
	
	
	
	
0x200    c     3
}

^LCall by Reference

#include <iostream>
	
	
	

using namespace std;
	
	
	
	
	

void swap(int&,int&);
	
	
	


int main()
	
	
	
	
main() 的變數:
{
	
	
	
	
	
Address  Name  Value
	
int a=3,b=4;
	
	
	
0x100    a     4
	
swap(a,b);
	
	
	
0x104    b     3
	
cout << "a=" << a 
	
     << ",b=" << b << endl;
	
執行結果顯示: a=4,b=3
	

	
	
	
	
	
成功的在 swap() 中修改了 main()中 a,b 的值
	
return 0;
	
	
	

}

void swap(int& a, int& b)
	
	
swap() 的變數:
	
	
 
{
	
	
	
	
	
Address  Name  Value
	
 
	
int c = a;
	
	
	

	
a = b;
	
	
	
	

	
b = c;
	
	
	
	

}



--
※ 來源: DISP BBS (http://disp.twbbs.org)
※ 作者: Knuckles  來自: 118.168.102.236  時間: 2010-03-07 16:45:19
※ 編輯: Knuckles  來自: 118.168.102.236  時間: 2010-03-07 16:47:03
※ 編輯: Knuckles  來自: 118.168.102.236  時間: 2010-03-07 16:48:06
※ 編輯: Knuckles  來自: 118.168.102.236  時間: 2010-03-07 16:49:00
※ <( ̄ー ̄)b 共 1 個人都讚這好!

--
※ 來源: DISP BBS (http://disp.twbbs.org)
※ 作者: Knuckles  來自: 118.168.102.236  時間: 2010-03-08 00:57:00
Knuckles:我也對這個板有點貢獻了 XD>>118.168.102.236 03-08 00:58
abc1231qa:本來想說晚一點再轉 然後就忘記了( ̄▽ ̄#)﹏﹏>>134.208.40.177 03-08 01:03
※ ott:轉錄至看板 ott 來自:118.166.0.65 時間:2010-03-12 04:27:47

--
※ 來源: DISP BBS (http://disp.twbbs.org)
※ 作者: uefangsmith  來自: 123.110.210.226  時間: 2010-03-26 00:45:14

※ 編輯: uefangsmith  來自: 123.110.210.226  時間: 2010-03-26 00:58:41
※ 看板: uefacool 文章推薦值: 0 目前人氣: 0 累積人氣: 58 
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇