背景:老師留了乙個作業,對兩個陣列進行相加,但是總是會出現錯誤;首先我們需要知道當陣列作為引數傳遞的時候是不能用 sizeof 的,因為當陣列傳入子函式就變成了普通的陣列頭;這時候使用 sizeof 只會檢測到指標的長度;
我們用模板來傳遞陣列,實際上並非模板可以傳遞陣列,而是引用傳遞完成了這件事
對應的現象是:值傳遞的陣列會衰減成指標
下面給出利用引用傳遞的**(沒有使用模板)
1 #include2在這個**中我們發現一件事,如果要傳遞這個陣列,我們首先要知道陣列的位數,但是我們要求的不就是陣列的位數嗎,這就是上文我們做的,其實也是模板的主要作用:實參演繹,我們規定了兩個引數,這兩個引數到底誰是5位陣列,誰是10位陣列,這個工作在模板中被自動的完成了,綜合了上述兩種技術我們實現了陣列的傳遞using
namespace
std;34
int p(int (&a)[5
]); //子函式
5int
main();89
int b=p(a);
1011 cout
1213
return0;
14}
15int p(int (&a)[5
])
其次,我們需要知道子函式返回的陣列的時候也很麻煩,不僅僅因為返回的是指標,更是因為在子函式中定義的陣列會隨著函式的結束而釋放,最終只留下陣列頭乙個資料可以使用,所以我們用動態記憶體,去主動的分配乙個空間給陣列
現在我們把操作和方法放在下面:
模板:傳入乙個陣列(實現泛型程式設計,因為要傳入的這個陣列長度是不確定的)
引用傳遞:
這裡沒有操作原來的數,僅僅是為了減少拷貝的操作
new:
給陣列建立記憶體
delete:
配合new,釋放記憶體
以下**思路:
先弄兩個陣列,一起傳入到子函式中
由子函式建立新的陣列,通過加減法給新的陣列賦值,(new)
操作完新的陣列之後結束程式(delete)
1 #include2這個函式寫出來呢,主要是驗證一些函式的用法,這些函式雖然在這個程式中顯得「過分」了,但是在將來涉及到復用的時候,像這種泛型程式設計就可以大顯身手,順便複習一下new delete3using
namespace
std;
45 template //
要在模板引數列表中定義兩個模板引數;因為:
6int* plusarr(t1& a,t2& b); //
將來傳入的int[10]和int[5]是兩個不同的型別 78
intmain();
11int b[5]=;
1213
int* sum=plusarr(a,b); //
用sum儲存這個指標,因為plusarr棧會清掉(包括指標p)
1415
int i=0;16
while(sum[i]!='\0'
)2021delete sum; //
釋放記憶體 在此,delete一定要加中括號!!
22}
2324 template25
int* plusarr(t1& a,t2&b)
35for(int i=n;i)
38 p[m]='
\0'; //
用來標誌
39return
p;40
} 41
else
46for(int i=n;i)
49 p[n]='\0'
;50return
p; 51}
5253 }
更加深入的理解:
下面我們列出乙個模板的定義,並嘗試去理解他的形式引數性質:
C 物件導向程式設計之模板
1 提高程式可重用性的兩種辦法 繼承 泛型程式設計 模板 2 模板的例項化 編譯器根據模板自動生成函式的過程稱為模板的例項化。3 函式模板的形式 template返回值型別 模板名 形參表 4 函式模板的一些特點 函式的模板中可以有不止乙個型別引數 template t2 print t1 arg1...
c 物件導向程式設計(二)
一 裝箱與拆箱 裝箱轉換允許將 值型別 隱式轉換為 引用型別 存在下列裝箱轉換 從任何 值型別 包括任何 列舉型別 到型別object。從任何 值型別 包括任何 列舉型別 到型別system.valuetype。從任何 值型別 到 值型別 實現的任何 介面型別 從任何 列舉型別 到system.en...
C 物件導向模型初探
前言 c 物件模型可以概括為以下2部分 1.語言中直接支援物件導向程式設計的部分,主要涉及如建構函式 析構函式 虛函式 繼承 單繼承 多繼承 虛繼承 多型等等。2.對於各種支援的底層實現機制。在c語言中,資料 和 處理資料的操作 函式 是分開來宣告的,也就是說,語言本身並沒有支援 資料和函式 之間的...