物件導向程式設計(二) C 模板初探

2022-02-20 17:08:44 字數 2155 閱讀 7170

背景:老師留了乙個作業,對兩個陣列進行相加,但是總是會出現錯誤;首先我們需要知道當陣列作為引數傳遞的時候是不能用 sizeof 的,因為當陣列傳入子函式就變成了普通的陣列頭;這時候使用 sizeof 只會檢測到指標的長度;

我們用模板來傳遞陣列,實際上並非模板可以傳遞陣列,而是引用傳遞完成了這件事

對應的現象是:值傳遞的陣列會衰減成指標

下面給出利用引用傳遞的**(沒有使用模板)

1 #include2

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

])

在這個**中我們發現一件事,如果要傳遞這個陣列,我們首先要知道陣列的位數,但是我們要求的不就是陣列的位數嗎,這就是上文我們做的,其實也是模板的主要作用:實參演繹,我們規定了兩個引數,這兩個引數到底誰是5位陣列,誰是10位陣列,這個工作在模板中被自動的完成了,綜合了上述兩種技術我們實現了陣列的傳遞

其次,我們需要知道子函式返回的陣列的時候也很麻煩,不僅僅因為返回的是指標,更是因為在子函式中定義的陣列會隨著函式的結束而釋放,最終只留下陣列頭乙個資料可以使用,所以我們用動態記憶體,去主動的分配乙個空間給陣列

現在我們把操作和方法放在下面:

模板:傳入乙個陣列(實現泛型程式設計,因為要傳入的這個陣列長度是不確定的)

引用傳遞:

這裡沒有操作原來的數,僅僅是為了減少拷貝的操作

new:

給陣列建立記憶體

delete:

配合new,釋放記憶體

以下**思路:

先弄兩個陣列,一起傳入到子函式中

由子函式建立新的陣列,通過加減法給新的陣列賦值,(new)

操作完新的陣列之後結束程式(delete)

1 #include2

3using

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 }

這個函式寫出來呢,主要是驗證一些函式的用法,這些函式雖然在這個程式中顯得「過分」了,但是在將來涉及到復用的時候,像這種泛型程式設計就可以大顯身手,順便複習一下new delete

更加深入的理解:

下面我們列出乙個模板的定義,並嘗試去理解他的形式引數性質:

C 物件導向程式設計之模板

1 提高程式可重用性的兩種辦法 繼承 泛型程式設計 模板 2 模板的例項化 編譯器根據模板自動生成函式的過程稱為模板的例項化。3 函式模板的形式 template返回值型別 模板名 形參表 4 函式模板的一些特點 函式的模板中可以有不止乙個型別引數 template t2 print t1 arg1...

c 物件導向程式設計(二)

一 裝箱與拆箱 裝箱轉換允許將 值型別 隱式轉換為 引用型別 存在下列裝箱轉換 從任何 值型別 包括任何 列舉型別 到型別object。從任何 值型別 包括任何 列舉型別 到型別system.valuetype。從任何 值型別 到 值型別 實現的任何 介面型別 從任何 列舉型別 到system.en...

C 物件導向模型初探

前言 c 物件模型可以概括為以下2部分 1.語言中直接支援物件導向程式設計的部分,主要涉及如建構函式 析構函式 虛函式 繼承 單繼承 多繼承 虛繼承 多型等等。2.對於各種支援的底層實現機制。在c語言中,資料 和 處理資料的操作 函式 是分開來宣告的,也就是說,語言本身並沒有支援 資料和函式 之間的...