一、物件作為函式的引數
物件也可以作為函式的引數傳遞給函式,其轉遞方法與傳遞其他型別的資料一樣,可採用值傳遞和位址傳遞兩種方法。
值傳遞時是把物件的拷貝而不是本身傳遞給函式,函式中對引數物件的任何修改都不會影響呼叫該函式的物件本身;
而位址傳遞時,呼叫該函式的物件與引數物件共用同乙個位址,所以,函式對引數物件的任何修改都會影響呼叫該函式的物件本身。?
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include
using
namespace
std;
class
tr
tr(
int
n)
void
set_i(
int
n)
int
get_i()
private
:
int
i;
};
void
sqr_it1(tr ob)
void
sqr_it2(tr *obj)
int
main()
呼叫sqr_it前,實參物件obj的資料成員i=10
在函式sqr_it1內,形參物件obj的資料成員i=100
呼叫sqr_it1後,實參物件obj的資料成員i=10
(此時,由於是以值傳遞,obj的資料成員i沒有變化,還是原先的10)
在函式sqr_it2內,形參物件obj的資料成員i=100
呼叫sqr_it2後,實參物件obj的資料成員i=100
(此時,由於是以位址傳遞,obj的資料成員i發生變化,為sqr_it2中的值100)
應該還可以按照引用來傳遞引數,當不能改變引數是最好用const修飾;
二、二維陣列作為函式的引數
在做資料結構迷宮實驗的時候,要生成乙個二維陣列儲存迷宮資料,為了保證程式的模組化,將生成部分單獨放進乙個函式migongsc()裡。大致**如下:
問題的關鍵就集中在了如何將主函式中宣告的二維陣列migong[8][9]傳遞到自定義函式中去。
方法1:模擬編譯器定址(本法來自csdn部落格,原文:
大體意思為:將二維陣列當作引數的時候,必須指明所有維數大小或者省略第一維的,但是不能省略第二維或者更高維的大小,這是由編譯器原理限制的。事實上,編譯器是這樣處理陣列的:
對於陣列 int p[m][n],如果要取p[i][j]的值(i>=0 && i
p + i*n + j;//注意n!!
這裡如果省略了第二維或者更高維的大小,編譯器將不知道如何正確的定址。根據這個思想,我們可以在程式中模擬編譯器定址的方法,具體如下:
方法二:純樸法:
由方法一衍生,顧名思義,直接將宣告的二維陣列的陣列名(即首位址)傳遞到自定義函式中。但要注意,在函式定義中必須指明第二維的維度!
方法三:二維陣列一維化
c++中的陣列和vb等語言中的陣列例項化的方式不一樣,多維陣列可以說是陣列的巢狀,即二維陣列中,每乙個元素是乙個一維陣列。
建立乙個一維陣列儲存每個子陣列(或者說元素陣列)的首位址,將該陣列傳遞給自定義函式。個人感覺除了提醒人陣列可以巢狀之外。。。是個很蛋疼的辦法。。。
總結:由於c++中不能對陣列進行引用(不知道為什麼),故而傳遞多維陣列的辦法都在指標上打主意。以上三個辦法中,第乙個辦法最具有擴充套件性,可以實現對陣列的先定義,後分配空間的美妙效果(詳見原文)。第二種辦法簡潔明瞭,符合思維習慣。第三種方法。。。呃。。。。
ps:非要使用引用的話,可以用二維向量代替陣列實現,以下為**:
注意二維向量宣告時的寫法:vector> migong(8);//注意空格!!!
歡迎指正!
物件作為函式引數
物件作為函式的引數時,其傳遞過程較為複雜,傳遞方式比較獨特。其傳參過程與陣列不同 陣列變數的名稱代表陣列的首位址,而物件的變數名稱卻不能代表物件的首位址。傳參時不會像陣列那樣以首位址作為函式的引數傳遞,而是先將物件中的所有資料進行備份 複製 將複製的資料作為形參傳遞到呼叫函式中去 類物件中的資料成員...
陣列作為函式引數
一 一維陣列名作函式引數 用陣列名作函式引數,應該在主調函式和被調函式分別定義陣列,例如 void main 在被呼叫函式中宣告了形引數組的大小為10,但在實際中,指定其大小是不起任何作用的,因為c語言編譯對形引數組大小不做檢查,只將實參陣列的首元素位址傳給形引數組。形引數組可以不指定大小,在定義陣...
陣列作為函式引數
陣列元素的作用與變數相當,一般來說,凡是變數可以出現的地方,都可以用陣列元素代替。陣列名也可以做實參和形參,傳遞的是陣列第乙個元素的位址。陣列元素可以用作函式實參,但是不能用作形參,因為形參是在函式被呼叫時臨時分配儲存單元的,不可能為乙個陣列元素單獨分配儲存單元 陣列是乙個整體,在記憶體中佔連續的一...