類模板中的成員函式建立時機
類模板中成員函式和普通類中成員函式建立時機是有區別的
普通類中的成員函式一開始就可以建立
類模板中的成員函式在呼叫時才建立
template
<
class
t>
class
myclass
void
func2()
//因為在呼叫之前,無法確定obj的資料型別,所以成員函式不會被建立
} myclassm;
m.func1()
; m.
func2()
;//當確定了t的資料型別時,就可以建立成員函式並呼叫
類模板物件做函式引數
類模板例項化出的對選哪個,像函式傳參的方式
一般有三種方式
1.指定傳入的型別——直接顯示物件的資料型別
2.引數模板化——將物件中的引數變為模板進行傳遞
3.整個類模板化——將這個物件型別模板化進行傳遞
template
<
classt1,
class
t2>
class
person
t1 m_name;
t2 m_age;
void
show()
}//指定傳入型別
void
printperson
(personint>
&p);
//引數模板化
template
<
classt1,
class
t2>
void
printperson
(person
&p);
typeid
(t1)
.name();
//顯示t1的資料型別,並以字串的形式顯示出來
//整個類模板化
template
<
class
t>
//直接將類的資料型別也處理為模板
void
person
(t &p);
personint>p(
"li"
,100
);
類模板與繼承
注意事項:
1.當子類繼承的父類是乙個類模板時,子類在宣告的時候,要制定出父類中t的型別
2.如果不指定的話,編譯器無法給子類分配記憶體
3.如果想靈活孩子定出父類中t的型別,子類也需變為類模板
template
<
class
t>
class
base
;class
son:
public base<
int>
//必須要知道父類中t的型別
;son s1;
//如果想靈活的指定父類中t的型別,子類也需要變為模板
template
<
classt,
class
t1>
class
son:
public base
son<
int,
char
>s2;
//需要同時指定出,父類和子類的資料型別
類模板成員函式的類外實現
template
<
classt1,
class
t2>
class
person
tamplate<
classt1,
class
t2>
person
::person
(t1 name,t2 age)
;//指明作用域,並說明是類模板的建構函式實現
類模板分檔案編寫
問題:類模板中的成員函式建立時機是在呼叫階段,導致分檔案編寫時鏈結不到
解決方式1:直接包含.cpp原始檔
解決方式2:將宣告和實現寫到同乙個資料夾中,並更改字尾名為.hpp,hpp時約定的名稱,並不是強制
//建立**件
#pragma once
//防止標頭檔案重複包含
//在**件中儲存類的定義
//建立cpp檔案 儲存類外的成員函式定義
#include
"person.h"
//外部函式呼叫時,標頭檔案不能包含**件,要包含cpp檔案
//因為定義時,模板未建立成員函式,所以只引用**件,無法發現成員函式
//也可以將宣告和實現寫在一起,將字尾名改為hpp
#include
"person.hpp"
C 學習筆記17 繼承
繼承 物件導向中的繼承指類之間的父子關係 子類擁有父類的所有成員變數和成員函式 子類就是一種特殊的父類 子類物件可以當作父類物件使用 子類可以擁有父類沒有的方法和屬性 繼承時候的訪問級別設定會影響到成員的訪問級別 class child parent 等價於class child private p...
C 學習筆記 (17)繼承
類的繼承或類的派生 把類按照其之間的關係組成的層次結構,稱之為類的繼承或類的派生。基類和派生類 水果是一種基類,桃 梨 蘋果是派生類 派生類可以繼承基類裡的屬性 欄位和方法,然後加上自己特殊的屬性 欄位和方法。派生的語法格式 類修飾符 class 派生類名 基類名 訪問控制問題public 都可以訪...
C語言學習筆記 17
1.聯結器 c語言有個思想是分別編譯,也就是把乙個c語言的專案分成若干個源程式,讓他們在不同的時候單獨進行編譯,然後在恰當的時候整合到一起。這個整合的過程就是由聯結器完成的。大多數時候,聯結器和編譯器都是分開的,聯結器本身並不懂得太多c語言的語法規則。因為他一般不與c直接接觸,我們想想之前說過c語言...